Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb $in运算符是否可以为不匹配的文档返回null?_Mongodb_Mongoose - Fatal编程技术网

Mongodb $in运算符是否可以为不匹配的文档返回null?

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

我需要返回提供给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);

您可以先使用初始筛选,然后使用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我很感激!