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

时间:2019-03-22 14:11:50

标签: mongodb mongoose

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

1 个答案:

答案 0 :(得分:1)

您可以先使用$in进行初始过滤,然后将输入数组中的所有值映射到最终结果中,然后$group-$$ROOT { enitre document),那么您可以使用$push$map运算符将输入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 ]
                            }
                        }
                    }
                }
            }
        }
    }
])

$filter