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.