1

私がやろうとしていること:

特定の条件に一致するコレクションのフィールドをフィルタリングします。フィールド内のすべてのアイテム (アイテムの配列) を返す代わりに、一致したアイテムのみを表示したいのです。

に似ている

select items from test where items.histPrices=[10,12]

これは、mongodb Web サイト ( http://www.mongodb.org/display/DOCS/Retrbeing+a+Subset+of+Fields ) にあるものにも似ています。

これが私が試したことです:

db.test.save({"name":"record", "items":[{"histPrices":[10,12],"name":"stuff"}]})
db.test.save({"name":"record", "items":[{"histPrices":[10,12],"name":"stuff"}, 
{"histPrices":[12,13],"name":"stuff"},{"histPrices":[11,14],"name":"stuff"}]})

db.test.find({},{"name":1,"items.histPrices":[10, 12]})

item[] 内のすべてのアイテムを含め、items.histPrices:[10,12] に一致するすべてのオブジェクトを返します。でも、条件に合わないものは欲しくない。

2 年前に Mongodb に残されたコメントから、その histPrices[10,12] を持つ項目のみを取得する解決策は、javascript コードを使用することです。つまり、結果セットをループして、他の項目を除外します。

クエリだけでそれを行う方法があるのだろうか。

4

3 に答える 3

3

あなたのfindクエリは間違っています

   db.test.find({},{"name":1,"items.histPrices":[10, 12]})

条件ステートメントは、find ステートメントの最初の部分にある必要があります。クエリで{}は、この SQL に類似したすべてのドキュメントを取得することを意味します。

   select items from test (no where clause)

mongodb find を次のように変更する必要があります

   db.test.find({"items.histPrices":[10, 12]},{"name":1})

機能させる

アイテムは配列であるため、一致するサブアイテムのみを返したい場合は、位置演算子を使用する必要があります

  db.test.find({"items.histPrices":[10, 12]},{"name":1,'items.$':1})
于 2012-11-03T15:38:37.897 に答える
0
db.test.aggregate({$unwind:"$items"}, {$match:{"items.histPrices":[10, 12]}})

でも、パフォーマンスが大丈夫かどうかはわかりません。データで確認する必要があります。

$unwindの使用法

のようなフィルター条件を追加する場合は、最初にname="record"別の条件を追加します$march。例:

db.test.aggregate({$match:{name:"record"}}, {$unwind:"$items"}, {$match:{"items.histPrices":[10, 12]}})
于 2012-11-03T11:16:36.183 に答える
0

ドキュメントに埋め込まれた配列を操作する場合、最良のアプローチは Chien-Wei Huang によって提案されたものです。

$group (ドキュメントが非常に長い場合、すべてのコンテンツを取得するのではなく、配列要素のみを取得する必要がある場合があります) 演算子を使用して、別の集計を追加します。

コマンドは次のようになります。

db.test.aggregate({$match:{name:"record"}}, 
{$unwind:"$items"}, 
{$match {"items.histPrices":[10, 12]}}, 
{$group: {_id: "$_id",items: {$push: "$items"}}});)

各コレクションの配列から 1 つの要素のみを返すことに関心がある場合は、代わりに射影を使用する必要があります。

ここで解決された同じ種類の問題: MongoDB 一致する必要がある 2 つのフィールドを指定して、コレクション内の配列のサブセットを取得する

于 2013-11-22T19:31:45.450 に答える