2016-07-05 49 views
1
{ 
    "_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 =假符合条件的文件。

我试图以这种方式使用的Java蒙戈司机

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

但它仍然给我回的所有文件,包括“deleteFl”:真。这里有什么帮助?

+0

我这里集合名称也期刊.. – kma

+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); 
    } 
+0

谢谢! @Sergiu Zaharie,它的工作:) – kma

相关问题