我需要返回提供给mongo的相同长度的数组。
usernames = ['user1', 'user2', 'user3']
现在假设user3
不存在,当 mongo 找不到文档时,有没有办法返回 null ?
如果我使用 $in
运算符,我只会得到匹配的文档,例如。
User.find({ username: { $in: usernames }})
result = [user1Document, user2Document]
我可以遍历数组并在数据库中查询每个用户名,但这效率不高。
const userPromises = usernames.map(username => User.findOne({ username }));
return Promise.all(userPromises);
您可以使用 $in 从初始过滤开始,然后将输入数组中的所有值映射到最终结果,您必须将它们$push $$ROOT
(enitre 文档($group,然后您可以使用$map和$filter运算符将输入usernames
与docs
合并:
db.col.aggregate([
{
$match: { username: { $in: ['user1', 'user2', 'user3'] } }
},
{
$group: {
_id: null,
docs: { $push: "$$ROOT" }
}
},
{
$project: {
_id: 0,
results: {
$map: {
input: ['user1', 'user2', 'user3'],
as: 'username',
in: {
$let: {
vars: {
filtered: {
$filter: {
input: "$docs",
as: "doc",
cond: { $eq: [ "$$doc.username", "$$username" ] }
}
}
},
in: {
$arrayElemAt: [ "$$filtered", 0 ]
}
}
}
}
}
}
}
])
蒙戈游乐场