我需要返回提供给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);
答案 0 :(得分:1)
您可以先使用$in进行初始过滤,然后将输入数组中的所有值映射到最终结果中,然后$group-$$ROOT
{ enitre document),那么您可以使用$push和$map运算符将输入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 ]
}
}
}
}
}
}
}
])