Meskipun Anda tampaknya telah mendekati struktur ini karena masalah dengan pembaruan dalam menggunakan array bersarang, Anda benar-benar hanya menyebabkan masalah lain dengan melakukan sesuatu yang lain yang tidak benar-benar didukung, dan itu adalah bahwa tidak ada "wildcard" konsep untuk mencari kunci yang tidak ditentukan menggunakan operator kueri standar yang optimal.
Satu-satunya cara Anda benar-benar dapat mencari data tersebut adalah dengan menggunakan kode JavaScript di server untuk menelusuri kunci menggunakan $where
. Ini jelas bukan ide yang bagus karena membutuhkan kekuatan kasar evaluasi daripada menggunakan hal-hal yang berguna seperti indeks, tetapi dapat didekati sebagai berikut:
db.theses.find(function() {
var relations = this.relations;
return Object.keys(relations).some(function(rel) {
return relations[rel].type == "interpretation";
});
))
Meskipun ini akan mengembalikan objek-objek dari koleksi yang berisi nilai bersarang yang diperlukan, ia harus memeriksa setiap objek dalam koleksi untuk melakukan evaluasi. Inilah sebabnya mengapa evaluasi seperti itu seharusnya benar-benar hanya digunakan ketika dipasangkan dengan sesuatu yang dapat langsung menggunakan indeks, bukan sebagai nilai keras dari objek dalam koleksi.
Masih solusi yang lebih baik adalah mempertimbangkan remodeling data untuk memanfaatkan indeks dalam pencarian. Jika perlu memperbarui informasi "peringkat", maka pada dasarnya "ratakan" struktur untuk mempertimbangkan setiap elemen "peringkat" sebagai satu-satunya data array sebagai gantinya:
{
"_id": "aeokejXMwGKvWzF5L",
"text": "test",
"relationsRatings": [
{
"relationId": "cF6iKAkDJg5eQGsgb",
"type": "interpretation",
"originId": "uFEjssN2RgcrgiTjh",
"ratingId": 1,
"ratingScore": 5
},
{
"relationId": "cF6iKAkDJg5eQGsgb",
"type": "interpretation",
"originId": "uFEjssN2RgcrgiTjh",
"ratingId": 2,
"ratingScore": 6
}
]
}
Sekarang pencarian tentu saja cukup sederhana:
db.theses.find({ "relationsRatings.type": "interpretation" })
Dan tentu saja posisi $
operator sekarang dapat digunakan dengan struktur yang lebih datar:
db.theses.update(
{ "relationsRatings.ratingId": 1 },
{ "$set": { "relationsRatings.$.ratingScore": 7 } }
)
Tentu saja ini berarti duplikasi data "terkait" untuk setiap nilai "peringkat", tetapi ini umumnya biaya untuk memperbarui berdasarkan posisi yang cocok karena hanya ini yang didukung dengan satu tingkat array bersarang saja.
Jadi Anda dapat memaksa logika agar sesuai dengan cara Anda menyusunnya, tetapi itu bukan ide yang bagus untuk melakukannya dan akan menyebabkan masalah kinerja. Namun, jika kebutuhan utama Anda di sini adalah memperbarui informasi "peringkat" daripada hanya menambahkan ke daftar dalam, maka struktur yang lebih datar akan lebih bermanfaat dan tentu saja jauh lebih cepat untuk ditelusuri.