假设我有一个结构如下的文档:
{
selectedId: ObjectId("57b5fb2d7b41dde99009bc75"),
children: [
{_id: ObjectId("57b5fb2d7b41dde99009bc75"), val: 10},
{_id: ObjectId("57b5fb2d7b41dde99009bc75"), val: 20},
]
}
其中父值"selectedId"总是引用子Id之一,我如何获得子子文档,其中_id = selectedId?
我尝试:
parentModel.findOne({'selectedId': 'this.children._id'})
然而,正如我现在所知道的,第二个字符串被作为字面量。那么如何在查询中引用父字段呢?Edit:显然,这可以通过两个查询来完成,获取父节点的"selectedId"值,然后再次查询。但是,我想在单个查询中完成此操作。
您可以使用聚合框架,特别是利用 $arrayElemAt
和 $filter
操作符返回子文档。下面的例子显示了这一点:
parentModel.aggregate([
{
"$project": {
"children": {
"$arrayElemAt": [
{
"$filter": {
"input": "$children",
"as": "item",
"cond": {
"$eq": ["$$item._id", "$selectedId"]
}
}
}, 0
]
}
}
}
]).exec(callback);