Jak wspomniałem, mam nadzieję, że twoje dokumenty rzeczywiście mają tablicę, ale jeśli $elemMatch działa dla ciebie, to powinny.
W każdym razie nie można sortować według elementu w tablicy za pomocą funkcji find. Ale jest przypadek, w którym możesz to zrobić za pomocą .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"
}}
])
Zasadniczo po wykonaniu $match
warunek dla dokumentów, które zawierały odpowiednie dopasowanie, następnie użyj $projekt
"przechowaj" oryginalny dokument w _id
pole i $unwind
„kopia” tablicy „entities”.
Następny $match
"filtruje" zawartość tablicy tylko do tych, które są istotne. Następnie zastosuj $sort
do "dopasowanych" dokumentów.
Ponieważ „oryginalny” dokument był przechowywany pod _id
, używasz $project
aby "przywrócić" strukturę, od której dokument faktycznie miał się zaczynać.
W ten sposób „sortujesz” według dopasowanego elementu tablicy.
Pamiętaj, że jeśli miałeś wiele "dopasowań" w tablicy dla dokumentu nadrzędnego, wtedy musiałbyś użyć dodatkowego $grupa
etap, aby uzyskać wartość $max dla pola „trafność”, aby zakończyć sortowanie.