亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號