2017-07-04 4 views
1

$in演算子は配列で動作します。MongoDB:サブ文書内のキーを持つ文書を検索

辞書には同等の機能はありますか?

次のコードは、2つのテストドキュメントを作成し、配列ドキュメントに列挙された値の1つを含むドキュメントを検索しますが、サブドキュメントに同じ値を含むものは見つかりません。以下の回答で提案されているようリストを使用

> use test 
> db.stuff.drop() 
> db.stuff.insertMany([{lst:['a','b'],dic:{a:1,b:2}},{lst:['a','c'],dic:{a:3,c:4}}]) 
{ 
     "acknowledged" : true, 
     "insertedIds" : [ 
       ObjectId("595bbe8b3b0518bcca4b1530"), 
       ObjectId("595bbe8b3b0518bcca4b1531") 
     ] 
} 
> db.stuff.find({lst:{$in:['b','c']}},{_id:0}) 
{ "lst" : [ "a", "b" ], "dic" : { "a" : 1, "b" : 2 } } 
{ "lst" : [ "a", "c" ], "dic" : { "a" : 3, "c" : 4 } } 
> db.stuff.find({dic:{$in:['b','c']}},{_id:0}) 
> 

EDIT(以下の答えに応じて)

は、目的の要素を見つけることから私を防ぎます。 、サブ文書については

> x=db.stuff.findOne({lst:{$in:['b','c']}},{_id:0}) 
{ "lst" : [ "a", "b" ], "dic" : { "a" : 1, "b" : 2 } } 
> x 
{ "lst" : [ "a", "b" ], "dic" : { "a" : 1, "b" : 2 } } 
> x.dic.a 
1 
> x.dic.b 
2 

答えて

3

:たとえば、この質問で、以下の回答で上記insertManyの両方を実行した後、次はないリストで、辞書を行うことができます(または、私は何かが足りないのですか?) $ inと全く同じことはありません。しかし、キーと値が{key: "key", value: 123}サブ文書の配列に変更されるように、あなたのスキーマを変更することで、

db.stuff.find({$or:[ 
    {'dic.b': {$exists: true}}, 
    {'dic.c': {$exists: true}} 
]}) 

推奨されるアプローチ:

あなたは$かと組み合わせ$存在するクエリ演算子を使用することができます
db.stuff.insertMany([ 
    {dic: [{key: 'a', value: 1}, {key: 'b', value: 2}]}, 
    {dic: [{key: 'a', value: 3}, {key: 'c', value: 4}]} 
]) 

次にあなたが特定のキーを使用してドキュメントを検索するには$を使用することができます。

db.stuff.find({'dic.key': {$in: ['a', 'b']}}) 

この新しいスキーマについては特に良いことは、あなたがのためにインデックスを使用することができますですクエリ内の$:あなたは上記の指摘のように

db.stuff.createIndex({'dic.key': 1}) 

欠点は、x.dic.aのような単純な要素へのアクセスは、もは​​や機能していることではありません。あなたの言語でコーディングを少し行う必要があります。例えば。 in Javascript:

> var doc = {dic: [{key: 'a', value: 3}, {key: 'c', value: 4}]} 
> function getValue(doc, key) { 
... return doc.dic.filter(function(elem) { 
...  return elem.key == key; 
... })[0].value; 
... } 
> getValue(doc, "a") 
3 
> getValue(doc, "c") 
4 
+0

私はここに書いてあまりにも長いコメントがありましたので、私は質問を編集しました。あなたはそれを見て、あなたの意見を教えてもらえますか? – stenci

+0

私の答えを更新しました。 –

+0

ありがとうございます。私は場合によっては、リスト/辞書のサイズ、おそらくどの戦略を使用するかによって決定します。 – stenci

関連する問題