2011-04-06 124 views
1

我想知道是否有任何方法可以進行復雜的選擇。 考慮下面的文檔集合:MongoDB數組謂詞

{ 
    image = "cab" 
    tags = [ 
      [ "NNP", 0 ], 
      [ "NN", 1 ] 
     ] 
}, 
{ 
    image = "castle" 
    tags = [ 
      [ "NNP", 2 ], 
      [ "NN", 1 ], 
      [ "VB", 0 ] 
     ] 
}, 
(etc) 

我將如何表達,檢查是否tags包含任何元素一樣,例如查詢,["NN", ?]在那裏我根本不關心內部數組的整數部分?請注意,內部數組是無序的,整數值是任意分配的。

請注意,我是mongodb的新成員,可能忽略了在文檔中執行此操作的方法。然而,我無法順利使用$elemMatch :-(

回答

3

我建議稍微另一個模式:

{ 
    image = "cab" 
    tags = [ 
      { name: "NNP", order: 0 }, 
      { name: "NN", order: 1 } 
     ] 
} 

有三個原因,爲什麼我提出另一個方案:

  1. 首先是因爲兩級嵌套通常難以查詢/更新
  2. 標籤數組中的數組包含不同類型的元素(int,string)
  3. A標籤陣列內rray看起來像我的兩個字段

隨着上述模式'標籤對象,你可以用一些名稱和順序標籤容易查詢:

db.images.find({ "tags.name" : "NN", "tags.order" : 1 }) 

更新:

Dot notation文檔

希望得到這個幫助!

+0

謝謝。我很懷疑。儘管你的查詢不能立即執行,因爲'tags'仍然是一個對象數組,但是發出一個'.find({「tags」:{$ elemMatch:{「tag」:「NN」}}})'did這個技巧在你的模式中很好。 – Manny 2011-04-06 09:14:27

+0

@曼尼:我的查詢都可以;)。 '.find({「tags」:{$ elemMatch:{「tag」:「NN」}}})'給出與.find相同的結果({「tags.tag」:「NN」)'。只要看看[文檔](http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24elemMatch)或詢問是否需要。另外我在我的答案中添加了'點符號'文檔的鏈接。 – 2011-04-06 09:36:43