Както отбелязах, надявам се вашите документи наистина да имат масив, но ако $elemMatch работи за вас, тогава трябва.
Във всеки случай не можете да сортирате по елемент в масив с помощта на find. Но има случай, в който можете да направите това с помощта на .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"
}}
])
Така че по същество, след извършване на $matchкод>
условие за документи, които съдържат съответното съвпадение, след това използвате $проект
"съхранявайте" оригиналния документ в _id
поле и $unwind
"копие" на масива "entities".
Следващият $match
"филтрира" съдържанието на масива само до тези, които са подходящи. След това прилагате $sort
към „съвпадащите“ документи.
Тъй като „оригиналният“ документ беше съхранен под _id
, използвате $project
за „възстановяване“ на структурата, с която документът всъщност трябваше да започне.
Това е начинът, по който "сортирате" вашия съвпадащ елемент от масив.
Имайте предвид, че ако сте имали множество „съвпадения“ в рамките на масив за родителски документ, тогава ще трябва да използвате допълнителен $group
етап, за да получите $max стойност за полето "уместност", за да завършите сортирането си.