[英]Mongodb java driver how to use filter in projection
我有此查詢在mongodb中正常工作:
db.document.aggregate([
{$match: { $and: [
{ type:ObjectId('abc') },
{ metadata: { $elemMatch: { metadataType: ObjectId("abc"), value: DBRef("tag", ObjectId("abc"))}}},
{ metadata: { $elemMatch: { metadataType: ObjectId("abc"), value: "abc"}}}
] }
},
{$project: {
metadata: {
$filter: {
input: "$metadata",
as: "metadata",
cond: { $or: [
{$eq: [ "$$metadata.metadataType", ObjectId("abc") ] },
{$eq: [ "$$metadata.metadataType", ObjectId("abc") ] }]}
}
}
}
如何使用mongodb驅動程序在JAVA中做到這一點? 我可以執行$ match階段,但不知道如何使用$ filter進行數組的$ project階段。
我可以使用Document.parse()(如此處建議的那樣: https : //groups.google.com/forum/#!topic/ mongodb-user/ W4wiPYk0Gec ),但我認為這很丑陋。 或者我可以使用類似這里的內容: Spring Data MongoDb是否支持$ filter數組聚合運算符? 但這也不太漂亮。
基本上我的問題是:在較新版本的mongodb驅動程序中,有沒有一種好的/更好的方法? (類似於spring mongodb的第三個答案: 查詢與mongodb中的條件匹配的文檔及其所有子文檔(使用spring) )
*****編輯
更准確地說:有沒有辦法像這里的比賽部分那樣:
AggregateIterable<Document> output = document.aggregate(
Arrays.asList(
Aggregates.match(and(
eq("type", new ObjectId("abc")),
elemMatch("metadata", and(eq("metadataType", language), eq("value", abc))),
elemMatch("metadata", and(eq("metadataType", workClusterName), eq("value", "abc")))
)),
Aggregates.project(filterHOWTO)
));
您可以使用MongoTemplate#aggregate
使用MongoTemplate#aggregate
的MongoTemplate
並將其傳遞給spring org.springframework.data.mongodb.core.query.Query
對象,該對象是通過org.springframework.data.mongodb.core.query.Criteria
構建器構建的圖案。 Criteria
對象具有elemMatch
等方法。在Criteria
對於您在此處發布的查詢的各個方面都有方法-您只需要學習如何在Criteria
構建器中將它們鏈接在一起即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.