2014-03-27 22 views
1

我的MongoDB的集合是這樣的:MongoDB的查詢只在內部文件

{ 
     "_id" : ObjectId("5333bf6b2988dc2230c9c924"), 
     "name" : "Mongo2", 
     "notes" : [ 
       { 
        "title" : "mongodb1", 
        "content" : "mongo content1" 
       }, 
       { 
        "title" : "replicaset1", 
        "content" : "replca content1" 
       } 
     ] 
    } 
    { 
     "_id" : ObjectId("5333fd402988dc2230c9c925"), 
     "name" : "Mongo2", 
     "notes" : [ 
       { 
        "title" : "mongodb2", 
        "content" : "mongo content2" 
       }, 
        { 
          "title" : "replicaset1", 
          "content" : "replca content1" 
        }, 
        { 
          "title" : "mongodb2", 
          "content" : "mongo content3" 
        } 
      ] 
    } 

我想查詢只顯示有標題爲「mongodb2」,但不希望完整的文檔說明。 我使用下面的查詢:

> db.test.find({ 'notes.title': 'mongodb2' }, {'notes.$': 1}).pretty() 
    { 
      "_id" : ObjectId("5333fd402988dc2230c9c925"), 
      "notes" : [ 
        { 
          "title" : "mongodb2", 
          "content" : "mongo bakwas2" 
        } 
      ] 
    } 

我期待它返回都指出,有標題爲「mongodb2」。 當我們查詢文檔中的文檔時,mongo是否只返回第一個文檔?

+0

可能重複的[MongoDB只提取數組中的選定項](http://stackoverflow.com/questions/3985214/mongodb-extract-only-the-selected-item-in-array) – WiredPrairie

+0

此問題已被已經在StackOverflow上多次詢問和回答。看看上面的鏈接和這個:例如http://stackoverflow.com/questions/5562485/get-particular-element-from-mongodb-array。 – WiredPrairie

+0

我覺得難以遵循這些問題,因爲它們來自聚合框架不存在的時間。對這些問題之一的接受答案甚至是使用map/reduce,這幾乎肯定不是OP所要的,因爲M/R不適合臨時查詢。 – mnemosyn

回答

1

positional $運營商只能返回它找到的匹配索引第一個匹配索引。

使用aggregate

db.test.aggregate([ 

    // Match only the valid documents to narrow down 
    { "$match": { "notes.title": "mongodb2" } }, 

    // Unwind the array 
    { "$unwind": "$notes" }, 

    // Filter just the array 
    { "$match": { "notes.title": "mongodb2" } }, 

    // Reform via group 
    { "$group": { 
     "_id": "$_id", 
     "name": { "$first": "$name" }, 
     "notes": { "$push": "$notes" } 
    }}  
]) 

所以,你可以用它來 「過濾器」 從特定的陣列文檔。

1

$總是指第一個匹配,$elemMatch投影算子也是如此。

我覺得你有三種選擇:

  1. 單獨的音符所以每個爲自己的
  2. 接受通過網絡和過濾器的客戶端發送更多數據
  3. 使用聚合管道的文件($match$project

我可能會選擇選項1,但你可能有你的數據模型的原因。

+0

我沒有將筆記作爲一個單獨的文檔分開,因爲所有筆記都有很少的重複常見值。如果我要在選項2和3之間進行選擇,則不確定哪一個具有更好的性能。還需要考慮使用Spring數據存儲庫的實現。 – jay