Di MongoDB db.collection.findOne()
metode mengembalikan satu dokumen yang memenuhi kriteria kueri yang ditentukan pada koleksi atau tampilan.
collection
bagian adalah nama koleksi atau tampilan yang akan dicari.
findOne()
mirip dengan find()
, kecuali findOne()
hanya mengembalikan dokumen pertama yang cocok dengan kriteria filter, menurut urutan alami yang mencerminkan urutan dokumen pada disk.
find()
sebaliknya, mengembalikan semua dokumen yang cocok.
Juga, findOne()
mengembalikan dokumen yang sebenarnya, sedangkan find()
hanya mengembalikan kursor ke setiap dokumen. Oleh karena itu, Anda tidak dapat menerapkan metode kursor ke findOne()
seperti yang Anda bisa dengan find()
.
Contoh
Misalkan kita memiliki koleksi yang disebut pets
dengan dokumen sebagai berikut:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Anjing", "berat" :10 }{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }Kita dapat menggunakan
findOne()
untuk mengembalikan satu dokumen.db.pets.findOne()
Hasil:
{ "_id" :1, "name" :"Wag", "type" :"Anjing", "berat" :20 }Di sini, kami menelusuri semua dokumen di
pets
koleksi. Kami tahu bahwa ini menelusuri semua dokumen karena kami tidak memberikan kriteria pemfilteran apa pun. Kami bahkan tidak memberikan argumen apa pun.Saat dipanggil tanpa argumen,
findOne()
mencari semua dokumen dari koleksi dan mengembalikan semua bidang untuk dokumen yang cocok.Cara lain untuk melakukan hal di atas adalah seperti ini:
db.pets.findOne({})
Dalam hal ini kami melewati dokumen kosong.
Dengan menambahkan ke dokumen kosong ini, kita dapat mulai memfilter hasilnya.
Berikan Kueri
Sintaks sebenarnya dari
findOne()
seperti ini:db.collection.findOne(query, projection)
Ini berarti Anda dapat meneruskan kueri sebagai argumen pertama, dan proyeksi sebagai argumen kedua.
Jika Anda meneruskan kueri, ini digunakan untuk memfilter cakupan pencarian hanya ke dokumen yang cocok dengan kueri tersebut. Kueri adalah dokumen yang berisi operator kueri. Seperti yang kita lihat pada contoh sebelumnya, dokumen kosong mengembalikan semua dokumen.
Mari kita persempit hasilnya menjadi subset dokumen dalam koleksi.
db.pets.findOne({"type":"Cat"})
Hasil:
{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }Ini mempersempit pencarian menjadi hanya dokumen-dokumen yang memiliki
type
bidang dengan nilaiCat
, lalufindOne()
mengembalikan dokumen pertama dari hasil itu.Dalam hal ini, kami hanya melewatkan dokumen sebagai kriteria pemfilteran.
Anda juga dapat menggunakan operator kueri. Ini memungkinkan Anda untuk menerapkan kriteria yang lebih spesifik ke kueri Anda.
Contoh:
db.pets.findOne({"weight": { $lt: 10 }})
Hasil:
{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }Dokumen Tersemat
Jika Anda memiliki dokumen yang berisi dokumen yang disematkan, Anda dapat menggunakan metode berikut untuk melakukan kueri data dalam dokumen yang disematkan.
- Notasi titik (mis.
field.nestedfield: <value>
) - Formulir bertingkat (mis. {
field: { nestedfield: <value> } }
). Perhatikan bahwa opsi ini hanya tersedia dari MongoDB 4.4.
Misalkan kita menyisipkan dokumen berikut.
db.pets.insertOne({ "_id" :6, "name" :"Fetch", "type" :"Dog", "specs" :{ "height" :400, "weight" :15, " warna" :"coklat" }})
Kita dapat menggunakan notasi titik untuk membuat kueri di dalam dokumen yang disematkan.
db.pets.findOne({ "specs.height": 400 })
Hasil:
{ "_id" :6, "name" :"Fetch", "type" :"Dog", "specs" :{ "height" :400, "weight" :15, "color" :"brown" }}
Kueri berikut mengembalikan dokumen yang sama, kecuali kali ini kami mereferensikan dokumen yang disematkan menggunakan formulir bersarang.
db.pets.findOne({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
})
Hasil:
{ "_id" :6, "name" :"Fetch", "type" :"Dog", "specs" :{ "height" :400, "weight" :15, "color" :"brown" }}
Saat menggunakan formulir bersarang, kueri harus sama persis dengan seluruh dokumen yang disematkan. Misalnya, kueri berikut tidak cocok:
db.pets.findOne({
"specs" : {
"height" : 400
}
})
Hasil:
null
Array
Anda dapat mereferensikan data dalam array dengan mereferensikan elemen array berdasarkan indeks atau nilainya.
Misalkan kita memasukkan dokumen berikut:
db.pets.insertOne({ "_id" :7, "name" :"Jake", "type" :"Anjing", "awards" :[ "Anjing Teratas", "Anjing Terbaik", "Anjing Terbesar" " ]})
Jika kami ingin menemukan semua anjing dengan penghargaan Top Dog, kami dapat menulis kueri berikut (yang akan mengembalikan anjing di atas).
db.pets.findOne({
"awards": "Top Dog"
})
Hasil:
{ "_id" :7, "name" :"Jake", "type" :"Anjing", "awards" :[ "Anjing Teratas", "Anjing Terbaik", "Anjing Terbesar" ]}
Anda juga dapat menentukan indeks elemen, seperti ini:
db.pets.findOne({
"awards.0": "Top Dog"
})
Melakukan itu mengharuskan nilai yang ditentukan berada pada indeks yang ditentukan. Oleh karena itu, kueri berikut tidak mengembalikan anjing yang sama.
db.pets.findOne({
"awards.1": "Top Dog"
})
Perhatikan bahwa array berbasis nol, jadi indeks 0 menentukan elemen pertama, 1 menentukan elemen kedua, dan seterusnya.
Proyeksi
Secara default, semua bidang dokumen dikembalikan saat Anda menggunakan findOne()
. Namun Anda dapat menggunakan proyeksi untuk mengurangi jumlah kolom yang ditampilkan jika diperlukan.
Anda mungkin ingat bahwa sintaks untuk findOne()
seperti ini:
db.collection.findOne(query, projection)
Dimana query
memberikan kriteria pemfilteran (yang telah kami lakukan dalam contoh di atas), dan projection
adalah proyeksi opsional yang menentukan bidang mana yang akan dikembalikan dari dokumen yang cocok. Oleh karena itu, jika kita ingin menggunakan proyeksi, kita cukup meletakkannya setelah query.
Saat menggunakan proyeksi, Anda dapat menentukan bidang yang akan disertakan , bidang yang akan dikecualikan , atau keduanya. Untuk melakukannya, buat daftar nama bidang dan salah satu 1
(untuk memasukkannya) atau 0
(untuk mengecualikannya).
Berikut adalah contoh penggunaan proyeksi untuk menentukan bidang yang akan disertakan:
db.pets.findOne({}, { name: 1, type: 1 })
Hasil:
{ "_id" :1, "name" :"Wag", "type" :"Anjing" }
Perhatikan bahwa _id
bidang dikembalikan meskipun kami tidak memasukkannya ke dalam proyeksi kami. Bidang ini merupakan pengecualian, dan disertakan secara default.
Jika Anda tidak menginginkan _id
untuk dikembalikan, Anda harus mengecualikannya secara eksplisit.
db.pets.findOne({}, { _id: 0, name: 1, type: 1 })
Hasil:
{ "name" :"Wag", "type" :"Anjing" }
Berikut contoh lain, kali ini kami hanya menentukan bidang mana yang akan dikecualikan.
db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 })
Hasil:
{ "name" :"Wag", "type" :"Anjing" }
Proyeksi Lebih Banyak
Ada berbagai hal lain yang dapat Anda lakukan dengan proyeksi. Misalnya, mulai dari MongDB 4.4 Anda dapat menggunakan ekspresi agregat untuk menentukan nilai bidang yang diproyeksikan.
Contoh:
db.pets.findOne({}, {
"_id": 0,
"n": "$name",
"t": "$type",
"w": "$weight"
})
Hasil:
{ "n" :"Wag", "t" :"Anjing", "w" :20 }
Di sini, kami mengganti nama bidang. Kami melakukan ini dengan menentukan nama baru untuk setiap bidang sebagai string literal, menggunakan $fieldName
sintaks untuk menampilkan nilai bidang itu. Hasilnya sedikit seperti menggunakan alias dalam SQL.
Informasi Lebih Lanjut
Lihat dokumentasi MongoDB untuk informasi lebih lanjut.