MongoDBは、フィールドが存在しないすべてのドキュメントを検索し、存在する場合はフィールド演算子($ max)条件を適用します

AlexZeDim

この質問ほぼ同じ$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ます。ドキュメント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"
  }
])

MongoPlayground

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ