Seperti yang disebutkan, saya berharap dokumen Anda benar-benar memiliki array, tetapi jika $elemMatch bekerja untuk Anda, maka seharusnya demikian.
Bagaimanapun, Anda tidak dapat mengurutkan berdasarkan elemen dalam array menggunakan find. Tetapi ada kasus di mana Anda dapat melakukan ini menggunakan .aggregate()
:
db.collection.aggregate([
// Match the documents that you want, containing the array
{ "$match": {
"nlp.entities": {
"$elemMatch": {
"text": "Neelie Kroes",
"type": "Person"
}
}
}},
// Project to "store" the whole document for later, duplicating the array
{ "$project": {
"_id": {
"_id": "$_id",
"url": "$url",
"nlp": "$nlp"
},
"entities": "$nlp.entities"
}},
// Unwind the array to de-normalize
{ "$unwind": "$entities" },
// Match "only" the relevant entities
{ "$match": {
"entities.text": "Neelie Kroes",
"entities.type": "Person"
}},
// Sort on the relevance
{ "$sort": { "entities.relevance": -1 } },
// Restore the original document form
{ "$project": {
"_id": "$_id._id",
"url": "$_id.url",
"nlp": "$_id.nlp"
}}
])
Jadi intinya, setelah melakukan $match
kondisi untuk dokumen yang berisi kecocokan yang relevan, Anda kemudian menggunakan $project
"simpan" dokumen asli di _id
bidang dan $unwind
"salinan" dari larik "entitas".
$match
berikutnya
"menyaring" konten larik hanya yang relevan. Kemudian Anda menerapkan $sort
ke dokumen "cocok".
Karena dokumen "asli" disimpan di bawah _id
, Anda menggunakan $project
untuk "memulihkan" struktur dokumen yang sebenarnya harus dimulai.
Begitulah cara Anda "mengurutkan" elemen larik yang cocok.
Perhatikan bahwa jika Anda memiliki beberapa "kecocokan" dalam larik untuk dokumen induk, maka Anda harus menggunakan $group
tahap untuk mendapatkan nilai $max untuk bidang "relevansi" untuk menyelesaikan pengurutan Anda.