2013-02-14 111 views
0

的匹配陣列我已經包含子對象的在其上的陣列的對象:蒙戈,數組

_id: "9", 
     clients: [ 
      { 
       id: 677, 
       enabled: true, 
       updated: 0, 
       created: 1352416600 
      }, 
      { 
       id: 668, 
       enabled: true, 
       updated: 0, 
       created: 1352416600 
      } 
     ], 
     cloud: false, 
     name: "love", 
} 

用戶作出對與客戶端ID 677的圖像的請求時,上述的目的將被返回

用戶作出對與客戶端圖像的請求ID 677和668,上述的圖像被返回

用戶作出對與客戶端圖像的請求ID 677,668,690,上述的圖像沒有返回

我使用PHP和Mongo DB。用於提供此功能的MYSQL查詢用於使用COUNT和子查詢。

我不知道哪裏可以開始在Mongo中解決這個問題。

任何幫助表示讚賞。

回答

2

要搜索數組內的文檔,可以使用點符號和「$和」運算符。

語法:

db.coll.find({"$and": [{"clients.id": <id1>}, {"clients.id": <id2>}, ... ]}); 

爲您的樣品:

1)用戶,使與客戶端ID 677(圖像只有一個項目的請求,也沒有必要的 「$和」但你可以使用無論如何):

db.coll.find({"clients.id": 677}); 

db.coll.find({"$and": [{"clients.id": 677}]}); 

2)用戶使得與客戶端圖像的請求ID 677和668:

db.coll.find({"$and": [{"clients.id": 677}, {"clients.id": 668}]}); 

3)用戶發出請求用於與客戶端映像的ID 677,668,690:

db.coll.find({"$and": [{"clients.id": 677}, {"clients.id": 668}, {"clients.id": 690}]}); 
+0

再次感謝,期待這更復雜 – azz0r 2013-02-15 14:36:07

+0

2)和3)不正確,因爲您不能在一個JS對象中多次使用相同的密鑰。使用'$和'就像你顯示的應該沒問題。 – JohnnyHK 2013-02-15 14:39:53

+0

@johnnyHK,這取決於你的語言。而且似乎mongo shell也接受它。請注意,我沒有存儲它,只是在查詢中使用。但是,「$和」選項似乎更好。 – MatheusOl 2013-02-15 19:20:06

0

還有一個更簡單的方法。

db.foo.find({「clients.id」:{$ in:[677,688,690]}});

希望這有助於

/節點X

編輯:

如果您需要匹配要返回文檔,你可以使用$ elemMatch爲

+0

「$ in」操作符可以匹配任何,而不是全部。 $ all操作符或$並且似乎是正確的方法。 – MatheusOl 2013-02-18 16:39:59

1

對於案件的具體結構如果數組字段包含每個項目列表,則可以使用$all運算符。

1)用戶針對圖像與客戶端ID的請求677:

db.coll.find({'clients.id': 677}); 

2)用戶,使與客戶端ID圖像的攝影請求

所以當你的三個情況都可以處理677和668:

db.coll.find({'clients.id': {$all: [677, 668]}}); 

3)用戶作出對圖像的請求與客戶端ID 677,668和690:

db.coll.find({'clients.id': {$all: [677, 668, 690]}});