我想创建一个查询,该查询获取一个列表并返回所请求字段中列表中包含的所有文档。
例如:
如果我有两份文件:
文件1
{
"list":["a","b","c"]
}
文件2
{
"list":["c","d","e"]
}
如果列表["a","b","c"]
,则应返回第一个文档
如果列表["a","b","c","d"]
,则应返回第一个文档
如果列表["a","c"]
,则不应返回
如果列表["a","b","c","d","e"]
,则两者都应返回
答案 0 :(得分:2)
您可以使用聚合框架执行此操作 - 比使用Javascript更快更好。
var yourList = ["a", "b", etc ] // your list here
db.collection.aggregate([
{$match:{list:{$in:yourList}}},
{$project:{originalList:"$list",list:1}},
{$unwind:"$list"},
{$match:{list:{$in:yourList}}},
{$group:{_id:"$_id",list:{$push:"$list"}, originalList:{$first:"$originalList"}}},
{$project:{keep:{$eq:["$list","$originalList"]},list:1}},
{$match:{keep:true}}
] );
您可以添加另一个$project
步骤以摆脱“保持”字段。显然,您想要在最后选择的文档中的任何其他字段也需要通过投影和分组阶段进行。