Mongodb $in运算符是否可以为不匹配的文档返回null?
我需要返回提供给mongo的相同长度的数组Mongodb $in运算符是否可以为不匹配的文档返回null?,mongodb,mongoose,Mongodb,Mongoose,我需要返回提供给mongo的相同长度的数组 usernames=['user1','user2','user3'] 现在让我们假设user3不存在,当mongo找不到文档时,有没有方法返回null 如果我使用$in操作符,我只会得到匹配的文档 User.find({username:{$in:usernames}}) result=[user1Document,user2Document] 我可以循环数组并查询数据库中的每个用户名,但效率不高 const userPromises = usern
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);
您可以先使用初始筛选,然后使用and运算符将输入数组中的所有值映射到最终结果,然后使用and运算符将输入的用户名与文档合并:
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 ]
}
}
}
}
}
}
}
])
您应该像以前一样,使用迭代为不存在的元素返回
null
。聚合技巧可能在这里有所帮助,但它比循环更昂贵。太好了,谢谢!如何对ObjectId执行相同的操作?当我尝试将用户名更改为“i'm get”时,“u id”以用户变量名的无效字符开头
@AsafAviv是的,您可以,但我需要查看您的代码以了解出现该错误的原因,请使用mongo Playerdthat@AsafAviv\u id
是MongoDB中的一个特殊字符串,请尝试以下方法:很好,谢谢你抽出时间@mickl我很感激!