2016-09-05 24 views
2
[{ 
    "username":"user1", 
    "products":[ 
      {"productID":1,"itemCode":"CODE1"}, 
      {"productID":2,"itemCode":"CODE1"}, 
      {"productID":3,"itemCode":"CODE2"}, 
     ] 
}, 
{ 
    "username":"user2", 
    "products":[ 
      {"productID":1,"itemCode":"CODE1"}, 
      {"productID":2,"itemCode":"CODE2"}, 
     ] 
}] 

製品の「itemCode」が「C​​ODE1」であるように、「user1」の「products」のすべての「productID」を検索したいと考えています。mongoDBネストされた配列内のドキュメントを検索するクエリ

mongoDBのどのようなクエリを行うべきですか?

+0

私の更新の答えをチェック –

+0

@ ReubenL。 thnx、 – Krisalay

答えて

2

単一の条件に一致する必要がある場合は、ドット表記で十分です。モンゴシェルで は:

db.col.find({"products.itemCode" : "CODE1", "username" : "user1"})

これは、ネストされた製品オブジェクトが "CODE1" itemCodeを持つすべてのユーザーを返します。

を更新しました

は、最初にあなたの要件に明確ではありませんでしたが、これはそれでなければなりません。

各製品を別々のエントリとして使用する場合は、集約フレームワークを使用する必要があります。まず、$unwindを使用して配列内のエントリを分割し、条件に$matchを使用します。

db.col.aggregate({$unwind: "$products"},{$match: { "username": "user1", "products.itemCode": "CODE1" } });

応答: { "_id" : ObjectId("57cdf9c0f7f7ecd0f7ef81b6"), "username" : "user1", "products" : { "productID" : 1, "itemCode" : "CODE1" } } { "_id" : ObjectId("57cdf9c0f7f7ecd0f7ef81b6"), "username" : "user1", "products" : { "productID" : 2, "itemCode" : "CODE1" } }

+0

これは私にもuser2の製品を与えるだろう、私はしたくない。 – Krisalay

+0

ああ、私はその要件を逃した、あなたはちょうど追加のパラメータとしてそれを追加することができます。 –

+0

'db.col.find({" username ":" user1 "、" products.itemCode ":" CODE1 "})' –

0

これを下回るAND条件に過ぎないようにあなたが(自分のコレクション名がcollection1であると仮定して)このため、複数のフィルタを必要とする

db.collection1.find({"username":"user1", "products.itemCode" : "CODE1"}) 
+0

最終的に "username"を " user1 " – Krisalay

+0

その場合は、$ unwind –

関連する問題