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