Saya memiliki koleksi MongoDB dengan dokumen dalam format berikut:
{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another ", "Name"],
"zipcode" : ["2224"]
}
Saat ini saya bisa mendapatkan dokumen yang cocok dengan ukuran array tertentu:
db.accommodations.find({ name : { $size : 2 }})
Ini dengan benar mengembalikan dokumen dengan 2 elemen dalam name
array. Namun, saya tidak bisa melakukan $gt
perintah untuk mengembalikan semua dokumen yang name
bidangnya memiliki ukuran array lebih dari 2:
db.accommodations.find({ name : { $size: { $gt : 1 } }})
Bagaimana saya bisa memilih semua dokumen dengan name
array ukuran lebih besar dari satu (lebih disukai tanpa harus mengubah struktur data saat ini)?
mongodb
mongodb-query
emson
sumber
sumber
Jawaban:
Memperbarui:
Untuk mongodb versi 2.2 + cara yang lebih efisien untuk melakukan hal ini dijelaskan oleh @JohnnyHK di lain jawabannya .
1.Menggunakan $ di mana
Tapi...
2.Buat bidang tambahan
NamesArrayLength
, perbarui dengan panjang array nama dan kemudian gunakan dalam permintaan:Ini akan menjadi solusi yang lebih baik, dan akan bekerja lebih cepat (Anda dapat membuat indeks di atasnya).
sumber
$where
, sangat fleksibel.Ada cara yang lebih efisien untuk melakukan ini di MongoDB 2.2+ sekarang Anda dapat menggunakan indeks array numerik dalam kunci objek kueri.
Anda dapat mendukung permintaan ini dengan indeks yang menggunakan ekspresi filter parsial (membutuhkan 3,2+):
sumber
{'Name Field.1': {$exists: true}}
.name
berisi setidaknya 1 elemen, tetapi OP mencari lebih dari 1.Saya percaya ini adalah permintaan tercepat yang menjawab pertanyaan Anda, karena itu tidak menggunakan
$where
klausa yang ditafsirkan :Ini berarti "semua dokumen kecuali yang tanpa nama (baik array yang tidak ada atau kosong) atau hanya dengan satu nama."
Uji:
sumber
{'name.1': {$exists: true}}
'name.1': {$exists: true}}
, dan juga karena ini adalah hardcoded untuk "1" dan tidak skala ke panjang array minimum sewenang-wenang atau parametrik.Anda juga dapat menggunakan agregat:
// Anda menambahkan "size_of_name" ke transit dokumen dan menggunakannya untuk menyaring ukuran nama
sumber
Coba lakukan sesuatu seperti ini:
1 adalah angka, jika Anda ingin mengambil catatan yang lebih besar dari 50 maka lakukan ArrayName.50 Terima kasih.
sumber
Tak satu pun dari yang di atas bekerja untuk saya. Yang ini jadi saya bagikan:
sumber
Anda dapat menggunakan $ expr (operator versi 3,6 mongo) untuk menggunakan fungsi agregasi dalam kueri reguler.
Bandingkan
query operators
vsaggregation comparison operators
.sumber
$name
array yang merupakan subdokumen, misalnya dalam catatan "orang"passport.stamps
,? Saya mencoba berbagai kombinasi kutipan tetapi saya dapat"The argument to $size must be an array, but was of type: string/missing"
.db.col.find({$expr:{$gt:[{$size:{$ifNull:["$passport.stamps", []]}}, 1]}})
sumber
MongoDB 3.6 termasuk $ expr https://docs.mongodb.com/manual/reference/operator/query/expr/
Anda dapat menggunakan $ expr untuk mengevaluasi ekspresi di dalam $ match, atau menemukan.
atau temukan
sumber
Saya menemukan solusi ini, untuk menemukan item dengan bidang array yang lebih besar dari panjang tertentu
Agregat $ pertandingan pertama menggunakan argumen yang benar untuk semua dokumen. Jika kosong, saya akan mendapatkannya
sumber
Saya tahu pertanyaan lamanya, tetapi saya mencoba ini dengan $ gte dan $ size. Saya pikir untuk menemukan () lebih cepat.
sumber
Meskipun jawaban di atas semuanya berfungsi, Apa yang awalnya Anda coba lakukan adalah cara yang benar, namun Anda hanya memiliki sintaks mundur (beralih "$ size" dan "$ gt") ..
Benar:
Salah:
sumber