如何在mongodb聚合的$filter中的AND中添加OR条件

rqenqsqc  于 2023-04-29  发布在  Go
关注(0)|答案(2)|浏览(158)

下面是我的聚合查询中的一个块,

{
          $addFields: {
            destinations: {
              $filter: {
                input: "$destinations",
                cond: {
                  $and: [
                    {
                      $or: [
                        {
                          "$$this.reported_at": {
                            $exists: false
                          }
                        },
                        {
                          "$$this.reported_at": {
                            $eq: null
                          }
                        }
                      ],
                    },
                    {
                      $eq: [
                        "$$this.type",
                        1
                      ]
                    }
                  ]
                }
              }
            }
          }
        },

运行时抛出以下错误

query failed: (InvalidPipelineOperator) Invalid $addFields :: caused by :: Unrecognized expression '$$this.reported_at'

尽管reported_at是另一个属性,就像destinations数组中的type一样。当我删除包含OR条件的对象时,它不会抛出错误。请帮我解决这个问题。
先谢谢你了

fjaof16o

fjaof16o1#

$filtercond字段中,必须使用表达式运算符。您的查询应如下所示:

{
  $addFields: {
    destinations: {
      $filter: {
        input: "$destinations",
        cond: {
          $and: [
            {
              $or: [
                {
                  $eq: [
                    "$$this.reported_at",
                    undefined
                  ]
                },
                {
                  $eq: [
                    "$$this.reported_at",
                    null
                  ]
                }
              ],
              
            },
            {
              $eq: [
                "$$this.type",
                1
              ]
            }
          ]
        }
      }
    }
  }
}
2izufjch

2izufjch2#

这一个也应该起作用:

db.collection.aggregate([
   {
      $addFields: {
         destinations: {
            $filter: {
               input: "$destinations",
               cond: {
                  $and: [                     
                     { $in: [{ $type: "$$this.reported_at" }, ['null', 'undefined', 'missing' ]] },
                     { $eq: ["$$this.type", 1] }
                  ]
               }
            }
         }
      }
   }
])

相关问题