MongoDB Java驱动程序如何在投影中使用过滤器

时间:2018-11-08 15:16:35

标签: java mongodb

我有此查询在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)
                ));

1 个答案:

答案 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构建器中。