我想做一个查询,它获取一个列表并返回请求字段列表中包含的所有文档。
例如:
如果我有两个文件:
文件 1
{
"list":["a","b","c"]
}
文件 2
{
"list":["c","d","e"]
}
如果是列表["a","b","c"],则应返回第一个文档
如果是列表["a","b","c","d"],则应返回第一个文档
如果是列表,则["a","c"]不应返回
如果是列表["a","b","c","d","e"],两者都应该返回
我想做一个查询,它获取一个列表并返回请求字段列表中包含的所有文档。
例如:
如果我有两个文件:
文件 1
{
"list":["a","b","c"]
}
文件 2
{
"list":["c","d","e"]
}
如果是列表["a","b","c"],则应返回第一个文档
如果是列表["a","b","c","d"],则应返回第一个文档
如果是列表,则["a","c"]不应返回
如果是列表["a","b","c","d","e"],两者都应该返回
您可以使用聚合框架来做到这一点 - 比使用 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步骤来摆脱“保留”字段。显然,您希望在最后选择的文档中的任何其他字段也需要通过投影和分组阶段。