sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB sorterar dokument efter arrayelement

Du kan inte göra det med arrayer, och huvudproblemet här är för att du vill att "sorteringen" ska ske på det matchade elementet. Om du vill sortera resultat så här måste du använda .aggregate() istället. Antingen som:

För moderna MongoDB-versioner:

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 till 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 } },
]);

Eller mindre effektivt i versioner före 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 } }         
])

Det är det enda sättet att matcha de korrekta elementen och få dem övervägda i en "sorteringsoperation". Standardmarkörsorteringen kommer bara annars att beakta värdena för fältet i arrayelementen som inte matchar din valda "typ" istället.




  1. Vad är namnkonventioner för MongoDB?

  2. DynamoDB vs MongoDB NoSQL

  3. vårdata mongodb id-fältkartläggning

  4. Samlingsobjektet är inte anropsbart fel med PyMongo