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

kueri mongodb:$size dengan $gt mengembalikan selalu 0

Anda tidak dapat melakukannya seperti yang sebenarnya dirujuk dalam dokumentasi untuk $size . Sehingga operator itu sendiri yang mengevaluasi hasil "literal" dan tidak bisa digunakan bersama dengan "operator jangkauan" seperti yang Anda tanyakan.

Satu-satunya opsi nyata Anda adalah meminta "ukuran" yang "tidak sama dengan 0" dengan meniadakan kondisi dengan $not operator. Yang benar-benar valid:

db.userStats.count({ "sessions": { "$not": { "$size": 0 } } });

Atau uji dengan inkarnasi lain dari $size dalam kerangka agregasi, selama versi MongoDB Anda adalah 2.6 atau lebih tinggi:

db.userStats.aggregate([
    { "$group": {
         "_id": null,
         "count": {
             "$sum": {
                 "$cond": [
                     { "$gt": [ { "$size": "$sessions", 0 } ] },
                     1,
                     0
                 ]
             }
         }
    }}
])

Mungkin juga dengan $where bentuk evaluasi JavaScript:

db.userStats.count(function() { return this.sessions.length > 0 });

Tapi sepertinya lebih lambat dari versi terakhir.

Atau sebenarnya Anda bisa melakukannya dengan "notasi titik" , dan $exists operator:

db.userStats.count({ "sesssions.0": { "$exists": true } });

Sebagai ide umum adalah bahwa jika ada elemen pada indeks 0 maka array memiliki beberapa panjang.

Itu semua tergantung pada pendekatan Anda, tetapi salah satu dari formulir ini mendapatkan hasil yang tepat.

Tetapi untuk kinerja "terbaik" dari MongoDB, jangan gunakan apa pun dari metode ini. Sebagai gantinya, pertahankan array "panjang" sebagai properti dari dokumen yang Anda periksa. Ini Anda dapat "mengindeks" dan kueri yang dikeluarkan benar-benar dapat mengakses indeks itu, yang tidak dapat dilakukan oleh yang di atas.

Pertahankan seperti ini:

db.userStats.update(
     { "_id": docId, "sessions": { "$ne": newItem } },
     {
         "$push": { "sessions": newItem },
         "$inc": { "countSessions": 1 }
     }
)

Atau untuk menghapus:

db.userStats.update(
     { "_id": docId, "sessions": newItem  },
     {
         "$pull": { "sessions": newItem },
         "$inc": { "countSessions": -1 }
     }
)

Kemudian Anda bisa menanyakan "countSesssions" yang juga dapat mengindeks untuk kinerja terbaik:

db.userStats.find({ "countSessions": { "$gt": 0 } })

Dan itulah cara "terbaik" untuk melakukannya.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose:Bagaimana cara mendapatkan statistik data unggahan 7 hari terakhir dari DB?

  2. Masukkan objek baru ke dalam bidang larik sub-dokumen di luwak

  3. Mengapa PyMongo 3 memberikan ServerSelectionTimeoutError?

  4. Cara Menginisialisasi Koleksi di Dockerized Mongo DB

  5. Sertakan bidang (_id atau lainnya) secara kondisional dalam agregasi proyek mongodb?