sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB třídí dokumenty podle prvků pole

Nemůžete to udělat s poli a hlavním problémem zde je, že chcete, aby se "třídění" stalo na odpovídajícím prvku. Pokud chcete výsledky takto třídit, musíte použít .aggregate() namísto. Buď jako:

Pro moderní verze MongoDB:

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

Pro MongoDB 2.6 až 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 } },
]);

Nebo méně efektivně ve verzích před 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 } }         
])

To je jediný způsob, jak spárovat správné prvky a nechat je zvážit v operaci „třídění“. Výchozí řazení kurzoru prostě jinak vezme v úvahu hodnoty pro pole v prvcích pole, které neodpovídají vašemu vybranému "typu".




  1. WRONGTYPE Operace proti klíči s nesprávným typem hodnoty php

  2. Úvod do datových struktur Redis:Seřazené sady

  3. Laravel Caching s Redis je velmi pomalý

  4. Jak mohu provádět příkazy v redis, aniž bych dostal vůbec žádnou odpověď?