[英]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.