2012-04-06 85 views
29

我有一個集合Notebook的嵌入式數組文件,稱爲Notes。樣本如何在MongoDB集合中獲取特定的嵌入式文檔?

文檔如下所示。

{ 
"_id" : ObjectId("4f7ee46e08403d063ab0b4f9"), 
"name" : "MongoDB", 
"notes" : [ 
      { 
       "title" : "Hello MongoDB", 
       "content" : "Hello MongoDB" 
      }, 
      { 
       "title" : "ReplicaSet MongoDB", 
       "content" : "ReplicaSet MongoDB" 
      } 
     ] 
} 

我只想找出標題爲「Hello MongoDB」的註釋。我沒有得到什麼

是查詢。誰能幫我。

回答

36

過時的回答:查看其他答案。


我不相信你問什麼是可能的,至少沒有一些可能的map-reduce?

在這裏看到:Filtering embedded documents in MongoDB

這個答案建議你改變你的模式,以更好地滿足您希望如何與數據進行工作。

您可以使用任一「點號」或$ elemMatch找回正確的,文件具有匹配的「筆記標題」 ......

> db.collection.find({ "notes.title" : "Hello MongoDB"}, { "notes.title" : 1"}); 

或...

> db.collection.find({ "notes" : { "$elemMatch" : { "title" : "Hello MongoDB"} }}); 

但你會回來整個陣列,不僅導致了比賽的數組元素。

此外,一些思考...您的當前設置它woud是很難做到的數組中的項目的任何操作。

如果你不改變你的架構(如答案鏈接到建議)...我會考慮在陣列中加入「IDS」每一個元素,所以你可以做這樣的事情,如果需要方便地將其刪除。

-3

可以這樣進行查詢:

db.coll.find({ 'notes.title': 'Hello MongoDB' }); 

您也可以參考docs瞭解更多詳情。

+8

嗡嗡聲我相信什麼是被問到的是如何取回只有**註釋**'你好MongoDB'作爲**標題**,你的例子會帶回註釋數組的*整個文檔! – 2012-04-06 17:54:13

73

你可以用蒙戈版本做高2.2

查詢是這樣的:

db.coll.find({ 'notes.title': 'Hello MongoDB' }, {'notes.$': 1}); 

你可以$elemMatch嘗試像賈斯汀·詹金斯

+5

這應該是正確的答案 – KIC 2014-02-21 13:31:51

+3

這將返回嵌入對象的父文檔的_id,除非從查詢中排除_id:... {'notes。$':1,'_id':0}); – Ushox 2015-06-27 10:03:44

+0

您正在使用的查詢結構的文檔在哪裏? – etech 2016-02-25 14:32:58

0

你可以用$或者$ elemMatch。 $運算符和$ elemMatch運算符根據條件投射數組中元素的子集。

的$ elemMatch投影算需要一個明確的條件的說法。這使您可以基於不在查詢中的條件進行投影。

db.collection.find(
    { 
     // <expression> 
    }, 
    { 
     notes: { 
      $elemMatch: { 
       title: 'Hello MongoDB' 
      } 
     }, 
     name: 1 
    } 
) 

$運算符根據查詢語句中的某些條件投影數組元素。

db.collection.find(
    { 
     'notes.title': 'Hello MongoDB' 
    }, 
    { 
     'notes.title.$': 1, 
     name: 1 
    } 
) 
2

你可以在MongoDb 3.2+版本中進行聚合。

查詢:

db.Notebook.aggregate(
    { 
     $project: { 
      "notes": { 
       $filter: { 
        input: "$notes", 
        as: "note", 
        cond: { 
         $eq: [ "$$note.title", "Hello MongoDB" ] 
        } 
       } 
      } 
     } 
    } 
) 

結果:

{ 
    "_id" : ObjectId("4f7ee46e08403d063ab0b4f9"), 
    "notes" : [ 
     { 
      "title" : "Hello MongoDB", 
      "content" : "Hello MongoDB" 
     } 
    ] 
} 

$$這裏用來訪問變量。我在這裏訪問$filter內新創建的note變量。

你可以在官方文檔中找到關於$filter$eq$$的更多資料。

$濾波器:選擇的陣列的一個子集返回基於指定的條件。返回僅包含與條件匹配的元素的數組。返回的元素按原始順序排列。

$ eq:比較兩個值,並在值相等或不等於(...)時返回true/false。

$$:變量可以容納任何BSON類型的數據。要訪問變量的值,請使用帶有前綴爲雙美元符號($$)的變量名稱的字符串。


注:

賈斯汀·詹金的回答是過時的,在這裏KOP的回答不從集合返回多個文件。通過這個彙總查詢,您可以根據需要返回多個文檔。

我需要這個,想發佈來幫助別人。

相關問題