MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB mengurutkan dokumen berdasarkan elemen array

Anda tidak dapat melakukannya dengan array, dan masalah utama di sini adalah karena Anda ingin "sort" terjadi pada elemen yang cocok. Jika Anda ingin mengurutkan hasil seperti ini maka Anda perlu menggunakan .aggregate() sebagai gantinya. Baik sebagai:

Untuk versi MongoDB modern:

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

Untuk MongoDB 2.6 hingga 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 } },
]);

Atau kurang efisien dalam versi sebelum 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 } }         
])

Itulah satu-satunya cara untuk mencocokkan elemen yang benar dan mempertimbangkannya dalam operasi "sortir". Pengurutan kursor default hanya akan mempertimbangkan nilai untuk bidang dalam elemen larik yang tidak cocok dengan "tipe" yang Anda pilih.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana cara mengurutkan catatan MongoDB ketika tidak ada urutan pengurutan yang ditentukan?

  2. MongoDB $max Aggregation Pipeline Operator

  3. Perintah Hitung MongoDB

  4. Bagaimana cara menanyakan MongoDB langsung dari Ruby alih-alih menggunakan Mongoid?

  5. MongoDB $pesanBoleh