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

Skema pilihan MongoDB untuk koleksi yang disematkan. dokumen vs. array

Dalam pendekatan pertama Anda, Anda tidak dapat mengindeks bidang id, karena id digunakan sebagai kunci. Jenisnya bertindak seperti kamus nilai kunci. Pendekatan ini berguna jika Anda memiliki kumpulan id yang diketahui (tentu saja jumlahnya lebih sedikit). Asumsikan Dalam contoh pertama Anda, id diketahui dengan baik di depan ,

>>db.your_colleection.find()
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "name" : "bill", 
  "lines" : { 
             "idk73716" : { "name" : "Line A" },
             "idk51232" : { "name" : "Line B" } ,
             "idk23321":  { "name" : "Line C" }
            } 
  }

jadi untuk menemukan nilai bidang id idk73716, Anda dapat melakukannya dengan

 db.your_colleection.find({},{'lines.idk73716':1})
 { "_id" : ObjectId("4ebbb6f974235464de49c3a5"), "lines" : { "idk73716" : { "name" : "Line A" } } }

{} kosong menunjukkan kueri, dan bagian kedua {'lines.idk73716':1} adalah pemilih kueri.

memiliki id sebagai kunci yang memiliki keuntungan memilih bidang tertentu saja. Meskipun {'lines.idk73716':1} adalah pemilih bidang, di sini ia berfungsi sebagai kueri dan pemilih. tetapi ini tidak dapat dilakukan dalam pendekatan kedua Anda. Asumsikan koleksi kedua seperti ini

> db.second_collection.find()
{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

Dan Anda mengindeks id bidang, jadi jika Anda ingin membuat kueri dengan id

> db.second_collection.find({'lines.id' : 'idk73716' })

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "name" : "bill", "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }
> 

dengan melihat output di atas, terlihat bahwa tidak ada cara untuk memilih sub(embedded) dokumen yang cocok saja, tetapi dimungkinkan pada pendekatan pertama. Ini adalah perilaku default mongodb.

lihat

db.second_collection.find({'lines.id' : 'idk73716' },{'lines':1})

akan mengambil semua baris, bukan hanya idk73716

{ "_id" : ObjectId("4ebbb9c174235464de49c3a6"), "lines" : [
    {
        "id" : "idk73716",
        "name" : "Line A"
    },
    {
        "id" : "idk51232",
        "name" : "Line B"
    },
    {
        "id" : "idk23321",
        "name" : "Line C"
    }
] }

Semoga membantu

EDIT

Terima kasih kepada @Gates VP untuk menunjukkan

Kami masih dapat menggunakan $exists untuk mengkueri id, tetapi tidak dapat diindeks



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Pecahan MongoDB dan server konfigurasi di server yang sama?

  2. Kriteria/agregasi:cari semua dokumen lengkap yang bidang arraynya memiliki elemen dengan status terbaru yang diberikan

  3. Bagaimana saya bisa menggunakan Mongoid dan ActiveRecord secara paralel di Rails 3?

  4. Cara menggunakan GridFS untuk menyimpan gambar menggunakan Node.js dan Mongoose

  5. Penjelasan Tanggal JSON