检索与作为子文档的数组元素中的条件匹配的所有文档

时间:2016-07-05 11:34:56

标签: java mongodb mongodb-query

 {
    "_id" : ObjectId("577b54816081dd32cd3e2d60"),
    "user" : ObjectId("577b54816081dd32cd3e2d5e"),
    "journals" : [ 
        {
            "title" : "Journal Title2",
            "desc" : "desx2",
            "feeling" : 3,
            "date" : ISODate("2016-07-05T06:32:45.404Z"),
            "deleteFl" : true,
            "_id" : ObjectId("577b548d6081dd32cd3e2d64")
        }, 
        {
            "title" : "Journal Title3",
            "desc" : "desx3",
            "feeling" : 3,
            "date" : ISODate("2016-07-05T06:49:00.156Z"),
            "deleteFl" : false,
            "_id" : ObjectId("577b585c6081dd32cd3e2d6d")
        }, 
        {
            "title" : "Journal Title4",
            "desc" : "desx4",
            "feeling" : 3,
            "date" : ISODate("2016-07-05T06:49:06.700Z"),
            "deleteFl" : false,
            "_id" : ObjectId("577b58626081dd32cd3e2d70")
        }
    ]
}

以上是我的文档结构

现在,我需要所有日志文件,其deleteFl = false。

我尝试使用Java Mongo驱动程序

getDatabase().getCollection("journals").find(and(eq("user", user), eq("journals.deleteFl", false)));

但它还是给了我所有文件,包括“deleteFl”:true。这里有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

实际上,您的查询返回1个文档,因为数据位于1个文档中。你想要的是限制文档的返回字段(限制子文档)。

注意:您可以使用投影中的elemMatch来执行此操作,以限制查询返回的字段。但elemMatch只返回一个子文档。 (我使用elemMatch发布了删除的错误答案)

如果需要所有子文档和数组内的特定子文档,则需要使用聚合管道。 这是一个经过测试的代码,可以执行您想要的操作(只需更改DB和colelction名称):

    MongoClient mongoClient = new MongoClient();
    MongoDatabase db = mongoClient.getDatabase("test");
    MongoCollection collection = db.getCollection("test");

    Iterable<Document> output = collection.aggregate(asList(
             new BasicDBObject("$unwind", "$journals"),
             new BasicDBObject("$match", new BasicDBObject("journals.deleteFl", false))
    ));

    for (Document dbObject : output)
    {
        System.out.println(dbObject);
    }