2016-07-05 58 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

相關問題