$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 而不是 foreingField 和 localField 因为我需要使用 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 需要一个数组作为第二个参数的主要内容,如果未能解决你的问题,请参考以下文章