sql >> データベース >  >> NoSQL >> MongoDB

MongoDBは、配列要素でドキュメントを並べ替えます

    配列ではこれを行うことはできません。ここでの主な問題は、一致した要素で「並べ替え」を実行する必要があるためです。このように結果を並べ替える場合は、.aggregate()を使用する必要があります 代わりは。次のいずれか:

    最新のMongoDBバージョンの場合:

    db.maps.aggregate([
        { "$match": { "points.type": "type1" }},
        { "$addFields": {
            "order": {
                "$filter": {
                  "input": "$points",
                  "as": "p",
                  "cond": { "$eq": [ "$$p.type", "type1" ] }
                }
            }
        }},
        { "$sort": { "order": 1 } }
    ])
    

    MongoDB2.6から3.0の場合

    db.maps.aggregate([
       { $match: { 'points.type': 'type1' } },
        {
         $project: {
           points: {
            $setDifference: [
              {
                $map: {
                  input: '$points',
                  as: 'p',
                  in: {
                    $cond: [
                      { $eq: ['$$p.type', 'type1'] },
                      '$$p',
                      false,
                    ]
                  }
                }
              },
              [false]
            ]
          }
        }
      },
      { $sort: { 'points.distanceToSpawn': 1 } },
    ]);
    

    または、MongoDB 2.6より前のバージョンでは効率が低下します:

    db.maps.aggregate([
        { "$match": { "points.type": "type1" }},
        { "$unwind": "$points" },
        { "$match": { "points.type": "type1" }},
        { "$group": {
            "_id": "$_id",
            "points": { "$push": "$points" }
        }},
        { "$sort": { "points.ditanceToSpawn": 1 } }         
    ])
    

    これが、正しい要素を照合し、それらを「ソート」操作で考慮させる唯一の方法です。デフォルトのカーソルソートでは、選択した「タイプ」と一致しない配列要素のフィールドの値が考慮されます。




    1. MongoDB-ドキュメントを更新する

    2. ロギング用のredis

    3. ベンダーロックインなしのMongoDB4.2管理と監視

    4. 基本的なMongoDBコマンドとは何ですか?それらの使用方法は?