我试图在mongodb中进行聚合查询,但是“$in”操作符说我传递给它的字段不能被识别为数组。
下面是我的聚合查询。
[
{
'$match': {
'isVisible': true,
'creatorId': new ObjectId('63ec13a4a2e93ccf1865218e')
}
}, {
'$lookup': {
'from': 'subscriptioncontracts',
'pipeline': [
{
'$match': {
'$expr': {
'$and': [
{
'$eq': [
'$userId', new ObjectId('64b7f95c9927ad922db3acc9')
]
}, {
'$gte': [
'$endDate', new Date()
]
}, {
'$lt': [
'$startDate', new Date()
]
}
]
}
}
}
],
'as': 'subscriptioncontracts'
}
}, {
'$lookup': {
'from': 'subscriptions',
'localField': 'subscriptioncontracts.subscriptionId',
'foreignField': '_id',
'as': 'subscriptioncontracts'
}
}, {
'$addFields': {
'subscriptioncontractsIds': {
'$map': {
'input': '$subscriptioncontracts',
'as': 'contract',
'in': '$$contract.creatorId'
}
}
}
}, {
'$match': {
'$or': [
{
'isPremium': false
}, {
'isPremium': {
'$exists': false
}
}, {
'$and': [
{
'isPremium': true
}, {
'creatorId': {
'$in':
'$subscriptioncontractsIds'
}
}
]
}
]
}
}
]
字符串
重要的是:
{
'$match': {
'$or': [
{
'isPremium': false
}, {
'isPremium': {
'$exists': false
}
}, {
'$and': [
{
'isPremium': true
}, {
'creatorId': {
'$in':
'$subscriptioncontractsIds'
}
}
]
}
]
}
}
型
我得到的错误是“$in需要一个数组”。
这是要在执行最后一次匹配操作之前添加的字段
screenshot of the result of the field "subscriptioncontractsIds".
我已经尝试了所有的方法,我知道查询工作正常,因为当我硬编码数组中出现的id时,查询工作正常。
{
'$match': {
'$or': [
{
'isPremium': false
}, {
'isPremium': {
'$exists': false
}
}, {
'$and': [
{
'isPremium': true
}, {
'creatorId': {
'$in':
[ObjectId('63ec13a4a2e93ccf1865218e')]
}
}
]
}
]
}
}
型
1条答案
按热度按时间ekqde3dh1#
这个答案与评论相呼应。我选择让它成为一个真实的答案,因为将
$in
的find
形式与聚合运算符$in
混淆是一个常见的错误,值得拥有可搜索的答案。在聚合管道中,以
{ $in: [ <expression>, <array expression> ] }
的格式使用$in
。有关详细信息,请参阅the docs。字符串