簡體   English   中英

MongoDB 查找字段不存在的所有文檔,如果存在則應用字段運算符 ($max) 條件

[英]MongoDB find all docs where field doesn't exists, plus if exists apply field operator ($max) condition

我正在為我的聚合中的$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請求每個文檔,無論是否具有 doc rank字段,然后,在$project階段按排名$exists進行“分離”

試試這個:

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游樂場

我找到了一個答案,與@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,或任何未在集合中使用的值。 然后我將結果分開。

Mongo游樂場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM