对于不匹配的文档,$in运算符是否可以返回 null



我需要返回提供给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运算符将输入usernamesdocs合并:

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 ]
                            }
                        }
                    }
                }
            }
        }
    }
])

蒙戈游乐场

最新更新