为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕沐林林 2022-07-15 09:34:35
$match我正在为我的聚合中的一个阶段寻找一个查询,它与这个问题几乎相同,但是..如果文档中不存在字段(在我的情况下命名为排名),则将文档添加到结果中但是如果字段存在,则将$operator条件(在我的情况下是$max)应用于该字段,并将所有符合此条件的文档添加到结果中。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
查看完整描述

2 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

试试这个:


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"

  }

])


查看完整回答
反对 回复 2022-07-15
?
慕神8447489

TA贡献1780条经验 获得超1个赞

我找到了一个答案,与@Valijon 的方法分开,但它也是基于上面的逻辑。我的查询是:


db.collection.aggregate([

  {

    $match: {

      item: id

    }

  },

  {

    $project: {

      method: 1,

      item: 1,

      rank: {

        $ifNull: [

          "$rank",

          0

        ]

      }

    }

  },

  {

    $group: {

      _id: "$item",

      data: {

        $addToSet: "$$ROOT"

      },

      min_value: {

        $min: "$rank"

      },

      max_value: {

        $max: "$rank"

      }

    }

  },

  {

    $unwind: "$data"

  },

  {

    $match: {

      $or: [

        {

          $expr: {

            $eq: [

              "$data.rank",

              "$max_value"

            ]

          }

        },

        {

          $expr: {

            $eq: [

              "$data.rank",

              "$min_value"

            ]

          }

        },

      ]

    }

  }

])

我的查询基于$project给出空字段值 0 的阶段。它也可以是 -1,或任何未在集合中使用的值。然后我将结果分开。


查看完整回答
反对 回复 2022-07-15
  • 2 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信