MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB sortiert Dokumente nach Array-Elementen

Mit Arrays ist das nicht möglich, und das Hauptproblem besteht darin, dass die "Sortierung" für das übereinstimmende Element erfolgen soll. Wenn Sie die Ergebnisse so sortieren möchten, müssen Sie .aggregate() verwenden stattdessen. Entweder als:

Für moderne MongoDB-Versionen:

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

Für MongoDB 2.6 bis 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 } },
]);

Oder weniger effizient in Versionen vor 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 } }         
])

Nur so können die richtigen Elemente abgeglichen und bei einer „Sort“-Operation berücksichtigt werden. Die Standard-Cursor-Sortierung berücksichtigt stattdessen nur die Werte für das Feld in den Array-Elementen, die nicht mit Ihrem ausgewählten "Typ" übereinstimmen.