2

次のことを達成するにはどうすればよいですか?

db.test.save( {a: [1,2,3]} );

db.test.find( {a: [1,2,3,4]} );  //must match because it contains all required values [1, 2, 3]
db.test.find( {a: [1,2]} );  //must NOT match because the required value 3 is missing

$in と $all については知っていますが、動作が異なります。

4

2 に答える 2

1

現在、サブセット値を持つドキュメントを検索する演算子はありません。$subset 演算子を追加する改善案があります。JIRA で問題に投票してください: https://jira.mongodb.org/browse/SERVER-974

ユースケースに適さない可能性があるその他の潜在的な回避策には、map reduce または新しい集計フレームワーク (MongoDB バージョン 2.2 で利用可能) が含まれる場合があります: http://docs.mongodb.org/manual/reference/aggregation/#_S_project

于 2012-07-30T22:03:31.650 に答える
1

興味深い..問題は..$in および $or 演算子が、ドキュメント内の配列の要素ではなく、コレクション内の各ドキュメントと比較ている配列の要素に適用されることです..要約するには質問: コレクション内のドキュメントのいずれかがたまたま渡された配列のサブセットである場合、それを一致させたいと考えています。入力と出力を交換しない限り、これを行う方法は考えられません。私が言いたいのは..最初の入力を取りましょう:

db.test.find( {a: [1,2,3,4]} );

これを一時的なコレクションに入れることを検討してください: たとえば、temp as:

db.temp.save( {a: [1,2,3,4]} );

テスト コレクション内の各ドキュメントを反復処理し、$all 演算子を使用して、temp でそれを「検索」して、それが完全であることを確認します。つまり、次のようにします。

foreach(doc in test)
{ db.temp.find( { a: { $all: doc.a } } ); }


これは間違いなく回避策です!この仕事ができるオペレーターが他にいないかどうかはわかりません。

于 2012-07-27T20:57:42.390 に答える