mongoose mongodb运算符“$in”无法识别数组类型的现有字段

vcirk6k6  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(120)

我试图在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')]
              }
            }
          ]
        }
      ]
    }
  }

ekqde3dh

ekqde3dh1#

这个答案与评论相呼应。我选择让它成为一个真实的答案,因为将$infind形式与聚合运算符$in混淆是一个常见的错误,值得拥有可搜索的答案。
在聚合管道中,以{ $in: [ <expression>, <array expression> ] }的格式使用$in。有关详细信息,请参阅the docs

{
    '$match': {$expr: {
      '$or': [
        {'isPremium': false},
        {'isPremium': {'$exists': false}},
        {'$and': [
            {'isPremium': true},
            {$in: [ '$creatorId', '$subscriptioncontractsIds' ]}
            ]
        }
      ]
    }}
}

字符串

相关问题