我有此查询在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),但我认为这很丑陋。 或者我可以在这里使用类似的命令:Does Spring Data MongoDb support $filter array aggregations operator?但它也不是很漂亮。
基本上我的问题是:在较新版本的mongodb驱动程序中,有没有一种好的/更好的方法? (有点像春季mongodb的第三个答案:Query a document and all of its subdocuments that match a condition in mongodb (using 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)
));
答案 0 :(得分:0)
您可以使用MongoTemplate
使用spring的MongoTemplate#aggregate
并将其传递给spring org.springframework.data.mongodb.core.query.Query
对象,该对象是通过org.springframework.data.mongodb.core.query.Criteria
构建器模式构建的。 Criteria
对象具有用于elemMatch
的方法,依此类推。Criteria
中有针对您在此处发布的查询的各个方面的方法-您只需学习如何将它们链接在一起在Criteria
构建器中。