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

Apakah ada hal lain jika di MongoDB ke $cond saat mengagregasi

Dengan rilis modern ( sejak MongoDB 3.4 ), Anda akan menggunakan $switch , yang pada dasarnya adalah mitra dari switch atau case kata kunci dalam implementasi bahasa lain:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$switch": {
        "branches": [
          { "case": { "$eq": [ "$field1", "4" ] }, "then": 30 },
          { "case": { "$eq": [ "$field1", "8" ] }, "then": 25 }
        ],
        "default": 10
      }
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
])

Ini menghindari bersarang if..then..else kondisi seperti yang dapat dilakukan menggunakan $cond dan ditunjukkan di bawah ini. Tetapi di bawah ini masih menunjukkan sebagai contoh bahwa ini selalu dapat dilakukan, bahkan sebelum operator baru bahkan dari if..then..else eksplisit kata kunci karena notasi array asli selalu mempertahankan sintaks tersebut.

Perhatikan juga bahwa array kondisi di sini biasanya juga jauh lebih mudah untuk dibuat secara terprogram daripada membuat bersarang struktur data untuk pernyataan yang diperlukan dengan $cond .

if..then..else kata kunci ke $cond operator hanyalah tambahan terbaru pada versi terbaru MongoDB pada saat penulisan ( MongoDB 2.6 adalah pengenalan kata kunci . Operator sebenarnya tersedia dengan rilis kerangka kerja agregasi di MongoDB 2.2 ). Tujuannya adalah untuk kejelasan tetapi dalam kasus ini tampaknya telah menyebabkan beberapa kebingungan.

Sebagai if..then.else operator $cond memang ternary operator, seperti yang akan diimplementasikan dalam banyak bahasa pemrograman. Ini berarti sebagai kondisional "inline", daripada membuat "blok" logika ke kondisi, apa pun yang tidak memenuhi kondisi pertama termasuk dalam else .

Oleh karena itu Anda "menyarangkan" pernyataan daripada mengikuti blok:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$cond": { 
        "if": { "$eq": [ "$field1", "4" ] }, 
        "then": 30,
        "else": {
          "$cond": {
            "if": { "$eq": ["$field1","8"]}, 
            "then": 25, 
            "else": 10
          }
        }
      }
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
]);

Atau bahkan dengan array asli notasi, yang mungkin lebih disukai beberapa orang jika membuat pernyataan secara terprogram:

db.items.aggregate([
  { "$project": {
    "name": 1,
    "customfield": {
      "$cond": [
         { "$eq": [ "$field1", "4" ] }, 
         30,
         { "$cond": [
           { "$eq": ["$field1","8"] },
           25, 
           10
         ]}
      ]
    }
  }},
  { "$sort": { customfield: 1 }},
  { "$limit":12 }
]);

Ternary berarti tiga syarat, tidak lebih tidak kurang. Jadi semua if..then..else logika harus bersarang.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:BSON ke JSON

  2. Apakah module.require(...).* mengembalikan salinan module.exports.* atau referensinya?

  3. MongoDB memperbarui objek array di dalam array

  4. Gunakan Mongosniff untuk mengklarifikasi apa yang MongoDB dengar dan katakan

  5. Mencocokkan bidang array yang berisi kombinasi apa pun dari array yang disediakan di MongoDB