$in 需要一个数组作为第二个参数

Posted

技术标签:

【中文标题】$in 需要一个数组作为第二个参数【英文标题】:$in requires an array as a second argument [duplicate] 【发布时间】: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 时才进行此查找?

谢谢!

【问题讨论】:

【参考方案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 上执行代码,它按预期工作。

以上是关于$in 需要一个数组作为第二个参数的主要内容,如果未能解决你的问题,请参考以下文章

带有数组的函数不起作用

使用脚本中的参数调用第二个脚本

JSON.stringify() 的使用

如何使用带有数组作为第二个参数的 mysqli::bind_param

关于作为函数参数的多维数组的声明定义和调用

将函数的第二个参数读入数组