MongoDB 匹配表达式查询无效

MongoDB match expression query not working

MongoDb 查询匹配表达式无效。

我有一个帖子集,只想 return 那些与创建它的用户的用户 ID 相匹配的帖子,但我的查询似乎不起作用。

示例数据集

[
  // 1
  {
    "_id": ObjectId("6257047cffd61ab62864c1ae"),
    "type": "A",
    "source": "B",
    "status": "A",
    "user": ObjectId("622b55ff0b0af6b049c387d3")
  },
  // 2
  {
    "_id": ObjectId("6257047cffd61ab62864c1ad"),
    "type": "B",
    "source": "A",
    "status": "A",
    "user": ObjectId("622b55ff0b0af6b049c387d3")
  },
  // 3
  {
    "_id": ObjectId("6257047cffd61ab62864c1ce"),
    "type": "A",
    "source": "C",
    "status": "B",
    "user": ObjectId("622b55ff0b0af6b049c387d3")
  },
  // 4
  {"_id": ObjectId("6257047cffd61ab62864c1cb"),
  "type": "A",
  "source": "B",
  "status": "C",
  "user": ObjectId("622b56250b0af6b049c387d6")
}
]

MongoDb 查询:-

db.collection.aggregate([
  {
    $addFields: {
      paramType: "All",
      paramSource: "All",
      paramStatus: "All",
      
    },
    
  },
  {
    $match: {
      $expr: {
        $and: [
          {
            user: ObjectId("622b55ff0b0af6b049c387d3")
          },
          {
            $or: [
              {
                $eq: [
                  "$paramType",
                  "All"
                ],
                
              },
              {
                $eq: [
                  "$paramType",
                  "$type"
                ],
                
              },
              
            ],
            
          },
          {
            $or: [
              {
                $eq: [
                  "$paramSource",
                  "All"
                ],
                
              },
              {
                $eq: [
                  "$paramSource",
                  "$source"
                ],
                
              },
              
            ],
            
          },
          {
            $or: [
              {
                $eq: [
                  "$paramStatus",
                  "All"
                ],
                
              },
              {
                $eq: [
                  "$paramStatus",
                  "$status"
                ],
                
              },
              
            ],
            
          },
          
        ],
        
      },
      
    },
    
  },
  {
    $setWindowFields: {
      output: {
        totalCount: {
          $count: {}
        }
      }
    }
  },
  {
    $sort: {
      createdAt: -1
    }
  },
  {
    $skip: 0
  },
  {
    $limit: 6
  },
  {
    "$project": {
      "paramSource": false,
      "paramStatus": false,
      "paramType": false,
      
    }
  }
])

查询输出:-

[
  {
    "_id": ObjectId("6257047cffd61ab62864c1ae"),
    "source": "B",
    "status": "A",
    "totalCount": 4,
    "type": "A",
    "user": ObjectId("622b55ff0b0af6b049c387d3")
  },
  {
    "_id": ObjectId("6257047cffd61ab62864c1ad"),
    "source": "A",
    "status": "A",
    "totalCount": 4,
    "type": "B",
    "user": ObjectId("622b55ff0b0af6b049c387d3")
  },
  {
    "_id": ObjectId("6257047cffd61ab62864c1ce"),
    "source": "C",
    "status": "B",
    "totalCount": 4,
    "type": "A",
    "user": ObjectId("622b55ff0b0af6b049c387d3")
  },
  {
    "_id": ObjectId("6257047cffd61ab62864c1cb"),
    "source": "B",
    "status": "C",
    "totalCount": 4,
    "type": "A",
    "user": ObjectId("622b56250b0af6b049c387d6")
  }
]

查询无效输出包含所有用户创建的帖子,它没有过滤。

$match 部分应该类似于 this:

  {
    $match: {
      $and: [
        {
          user: ObjectId("622b55ff0b0af6b049c387d3")
        },
        {
          $or: [{paramType: {$eq: "All"}},
            {$expr: {$eq: ["$paramType", "$type"]}}
          ]
        },
        {
          $or: [{paramSource: {$eq: "All"}},
            {$expr: {$eq: ["$paramSource", "$type"]}}
          ]
        },
        {
          $or: [{paramStatus: {$eq: "All"}},
            {$expr: {$eq: ["$paramStatus", "$type"]}}
          ]
        }
      ]
    }
  }

$expr 应该只分配给文档中两个值都存在的情况。本次查询 returns 3 / 4 个文档,其中 user: ObjectId("622b55ff0b0af6b049c387d3")

顺便说一句,这个 $match 阶段的最后 3 个条件是多余的,因为它们将始终为真,因为查询将它们设置为前一个阶段 'All' 的值