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

Mongoose - menemukan subdokumen berdasarkan kriteria

Anda dapat menggunakan $elemMatch sebagai operator proyeksi kueri dalam versi MongoDB terbaru. Dari cangkang mongo:

db.parents.find(
    {'children.age': {$gte: 18}},
    {children:{$elemMatch:{age: {$gte: 18}}}})

Ini menyaring dokumen anak-anak yang lebih kecil dari children susunan:

{ "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] }
{ "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }

Seperti yang Anda lihat, anak-anak masih dikelompokkan di dalam dokumen induknya. Kueri MongoDB mengembalikan dokumen dari koleksi. Anda dapat menggunakan $unwind framework kerangka kerja agregasi metode untuk membaginya menjadi dokumen terpisah:

> db.parents.aggregate({
    $match: {'children.age': {$gte: 18}}
}, {
    $unwind: '$children'
}, {
    $match: {'children.age': {$gte: 18}}
}, {
    $project: {
        name: '$children.name',
        age:'$children.age'
    }
})
{
    "result" : [
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb5"),
            "name" : "Margaret",
            "age" : 20
        },
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb6"),
            "name" : "John",
            "age" : 22
        }
    ],
    "ok" : 1
}

Saya ulangi $match klausa untuk kinerja:pertama kali melalui itu menghilangkan orang tua dengan tidak anak-anak minimal 18 tahun, jadi $unwind hanya mempertimbangkan dokumen yang berguna. $match kedua menghapus $unwind keluaran yang tidak cocok, dan $project mengangkat info anak-anak dari subdokumen ke tingkat teratas.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara menggunakan MongoDB di Heroku

  2. Hapus dokumen yang disematkan dalam susunan dokumen bersarang

  3. Apa kesalahan Mongoose Cast to ObjectId gagal untuk nilai XXX di jalur _id?

  4. MongoDB menyisipkan float ketika mencoba memasukkan integer

  5. Pembaruan MongoDB()