【问题标题】:$in requires an array as a second argument [duplicate]$in 需要一个数组作为第二个参数
【发布时间】:2019-06-27 18:15:44
【问题描述】:

我正在尝试进行一些聚合,但遇到以下问题。我需要使用“管道”,当我要查找的数组丢失时出现错误。

{
    $lookup: {
        from: 'comments',
        let: { comments: '$comments' },
        pipeline: [
            {
                $match: {
                    $expr: {
                        $in: ['$_id', '$$comments']
                    },
                    isDeleted: false
                }
            }
        ],
        as: 'comments'
    }
}

在这个阶段我收到以下错误:

'$in requires an array as a second argument, found: missing'

因为并非所有文档都有“cmets”字段。

注意:我使用 pipeline 而不是 foreingFieldlocalField 因为我需要使用 isDeleted: false 和其他匹配条件进行过滤.

是否只有在文档具有字段 cmets 时才进行此查找?

谢谢!

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    您可以在$expr 中添加不为空或存在条件的$ifNull$and

    {
        $lookup: {
            from: 'comments',
            let: { comments: '$comments' },
            pipeline: [
                {
                    $match: {
                        $expr: {$and: [
                            {$in: ['$_id', {$ifNull :['$$comments',[]]}]},
                            {$eq: ["$isDeleted", false]}
                        ]}
                    }
                }
            ],
            as: 'comments'
        }
    }
    

    【讨论】:

    • 即使 Compass 给了我这个错误Expected "[" or AggregationStage but "{" found. 从 Mongoose 执行它,它也能按预期工作。 Compass 是否有任何理由认为它不正确?无论如何,非常感谢您的回复!
    • isDeleted: false$expr 之外,这可能是原因
    • @Anthony Winzlet,标记为重复我的问题的人,建议我需要在原始查找之上添加一个额外的层,$addField 以添加 cmets 数组(如果缺少)。以 $in 和 $eq 作为条件的 $expr 方式仍然给我错误...
    • @AlexandruComanescu 上面的解决方案也适用于$ifNull。现在是什么问题?重复的答案清楚地表明了原因
    • 嗨@AnthonyWinzlet,如果我的回复不清楚,对不起。我的意思是您的回答(添加$addField 阶段)解决了我的问题。使用$ifNull,我在 Compass 聚合中收到此错误Expected "[" or AggregationStage but "{" ,但在 mongoDB shell 上执行代码,它按预期工作。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多