首页 > 解决方案 > MongoDB查找字段不存在的所有文档,加上如果存在则应用字段运算符($ max)条件

问题描述

$match我正在为我的聚合中的一个阶段寻找一个查询,它与这个问题几乎相同,但是..

MongoPlayground 与示例集合

结果应该是这样的:

[
  {
    "method": 3,
    "item": 1,
    "rank": 3 //because it has field named rank, and suits condition {rank: $max}
  },
  {
    "method": 4,
    "item": 1 //we need this, because document doesn't have rank field at all
  },
  {
    "method": 5,
    "item": 1 //we need this, because document doesn't have rank field at all
  }
]

我已经尝试过的事情:

            {
                $match: {
                    $or: [
                        {item: id, rank: {$exists: true, $max: "$rank"}}, //id === 1
                        {item: id, rank: {$exists: false}} //id === 1
                    ]
                }
            }

UPD:就目前而言,可能我不仅限于$match阶段,$project默认匹配后也相关,所以我可以在$match阶段请求每个文档,id无论是否有 docrank字段,然后在$project阶段做一个“按等级分离”$exists

标签: javascriptmongodbmongoosemongodb-queryaggregation-framework

解决方案


试试这个:

db.collection.aggregate([
  {
    $match: {
      item: id
    }
  },
  {
    $group: {
      _id: "$item",   //<- Change here your searching field
      max: {
        $max: "$rank" //<- Change here your field to apply $max
      },
      data: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unwind: "$data"
  },
  {
    $match: {
      $expr: {
        $or: [
          {
            $eq: [
              {
                $type: "$data.rank"
              },
              "missing"
            ]
          },
          {
            $eq: [
              "$data.rank",
              "$max"
            ]
          }
        ]
      }
    }
  },
  {
    $replaceWith: "$data"
  }
])

Mongo游乐场


推荐阅读