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 query-projection 运算符仅返回查询结果中的第零个数组元素:

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

请参阅$slice,您可能还对新的$elemMatch投影运算符感兴趣。

于 2013-05-29T19:54:10.607 回答