【发布时间】:2020-09-22 21:31:04
【问题描述】:
我正在使用带有 Mongoose 包的 Nodejs。 鉴于我有这样的事情:-
let people = [
{
"_id": 1,
"name": "Person 1",
"pets": [
{
"_id": 1,
"name": "Tom",
"category": "cat"
},
{
"_id": 2,
"name": "Jerry",
"category": "mouse"
}
]
}
]
我只想使用pets array 中的Jerry 获取_id 的数据(结果如下图)
{
"_id": 2,
"name": "Jerry",
"category": "mouse"
}
在使用$elemMatch时,我可以不用指定person 1的_id就可以得到它吗?现在我的代码是这样的:-
const pet = People.find(
{ "_id": "1"}, // specifying 'person 1 _id' first
{ pets: { $elemMatch: { _id: 2 } } } // using 'elemMatch' to get 'pet' with '_id' of '2'
)
它给了我想要的东西,就像我在上面向你展示的那样。但是还有其他方法我可以做到这一点不需要先指定它的父级的_id(在这种情况下,people array 的_id )
【问题讨论】:
-
您可以使用positional $ projection operator。但是,您仍然需要指定数组字段被限制 - 必须 出现在查询过滤器中。这与使用
$elemMatch相同 - 只是$elemMatch投影在使用多个字段进行投影时很有用。 -
您在
filter中指定{ "_id": "1"}只是为了确保在响应和投影中只获得一个文档,您使用$elemMatch匹配pets数组中的相应对象,因此,如果您从过滤器中删除{ "_id": "1"},那么您将在 o/p 中获得多个文档(所有文档在 pets 数组中至少有一个带有"_id": 2的对象)
标签: arrays mongodb mongoose nested mongodb-query