我有以下数据:
{
_id: "1"
transitions: [
{
"_id" : "11"
"name" : "Tr1"
"checkLists" : [
{ _id: "111", name: "N1"},
{ _id: "112", name: "N2"}
]
}
]
}
我使用下面的代码通过查询_id:112获得名称N2
db.collection.findOne({ 'transitions.checkLists._id: new ObjectId("112") } }}, { 'transitions.checkLists.$': 1 })
但是结果返回了它们两个:
{ _id: ObjectId("1"),
transitions:
[ { checkLists:
[ { name: 'N1', _id: ObjectId("111") },
{ name: 'N2', _id: ObjectId("112") } ] } ] }
我想通过查询_id:112查找并仅获取名称N2预期结果:
{ _id: ObjectId("1"),
transitions:
[ { checkLists:
[ { name: 'N2', _id: ObjectId("112") } ] } ] }
1条答案
按热度按时间s3fp2yjn1#
您可以通过聚合框架执行此操作,如下所示:
解释道:
1.匹配第一阶段中的transitions.checkLists._id元素。
1.Map/合并对象与筛选的检查列表,以便仅从transitions.checkLists数组中筛选所需的对象。
1.删除不存在checkList的transitions元素。(需要执行此操作才能删除不存在matching _id的同一文档的元素)
Playground