1

コレクションに次のアイテムがあります。

{ "_id":1, "vals": [ { a:1, b:2, c:0 }, { a:1, b:2, c:1 }, { a:1, b:2, c :2 } ] }
{ "_id":2, "vals": [ { a:1, b:2, c:1 }, { a:1, b:2, c:2 }, { a:1, b:2, c:0 } ] }
{ "_id":3, "vals": [ { a:1, b:2, c:2 }, { a:1, b:2, c:0 }, { a:1, b:2, c:1 } ] }

( vals.c > 1 ) のすべてのアイテムを検索したいのですが、常に配列の最初の要素のみを考慮します。
正しい方法でそれを行うと、結果に _id:2, _id:3 という項目のみが表示されます。

次の検索リクエストを実行すると、代わりにすべてのアイテムが取得されます。

db.items.find( { vals: { $elemMatch: { c: { $gte:1 } } }, { "vals.$": 1 } } )

希望する結果を得るために、リクエストを行う方法はありますか?

4

1 に答える 1

1

おそらく驚くべきことに、次のように実行できます。

db.items.find({ 'vals.0.c': { $gte: 1 } })

$slice クエリ射影演算子を使用して、クエリ結果の 0 番目の配列要素のみを返すことを選択できます。

db.items.find({ 'vals.0.c': { $gte: 1 } }, {'vals': {'$slice': 1}})

$sliceを参照してください。新しい$elemMatch射影演算子にも興味があるかもしれません。

于 2013-05-29T19:54:10.607 に答える