我正在使用NodeJs,MongoDB Native 2.0 +
以下查询获取包含嵌入式人员和服务数组的一个客户端文档。
db.collection('clients').findOne({_id: sessId}, {"services._id": 1, "staff": {$elemMatch: {_id: reqId}}}, callback)
返回这样的结果:
{
_id: "5422c33675d96d581e09e4ca",
staff:[
{
name: "Anders"
_id: "5458d0aa69d6f72418969428"
// More fields not relevant to the question...
}
],
services: [
{
_id: "54578da02b1c54e40fc3d7c6"
},
{
_id: "54578da42b1c54e40fc3d7c7"
},
{
_id: "54578da92b1c54e40fc3d7c9"
}
]
}
请注意,services
中的每个嵌入对象实际上都包含多个字段,但_id
是通过查询投影返回的唯一字段。
从这个返回的数据开始,我从services
“拔出”所有id并将它们保存在稍后用于验证的数组中。这绝不是一个困难的操作......但我很好奇...有没有一种简单的方法来进行某种聚合而不是find
,直接从数据库获取已经被拔除的objectId的数组。像这样:
{
_id: "5422c33675d96d581e09e4ca",
staff:[
{
name: "Anders"
_id: "5458d0aa69d6f72418969428"
// More fields not relevant to the question...
}
],
services: [
"54578da02b1c54e40fc3d7c6",
"54578da42b1c54e40fc3d7c7",
"54578da92b1c54e40fc3d7c9"
]
}
答案 0 :(得分:2)
这样做的一种方法是首先,
$unwind
基于staff
字段的文档,这是完成的
选择预期的staff
。由于这个步骤是必需的
$elemMatch
中aggregation
运算符不可用
框架。
这里有一张开放票:Jira
根据staff
选择具有正确$unwind
的文档$services
后。
$group
,一起$push
将所有services _id
放在一个数组中。
然后是$project
运算符,以显示预期的字段。
db.clients.aggregate([
{$match:{"_id":sessId}},
{$unwind:"$staff"},
{$match:{"staff._id":reqId}},
{$unwind:"$services"},
{$group:{"_id":"$_id","services_id":{$push:"$services._id"},"staff":{$first:"$staff"}}},
{$project:{"services_id":1,"staff":1}}
])