Jak bylo uvedeno, doufám, že vaše dokumenty skutečně pole mají, ale pokud vám $elemMatch funguje, pak by měly.
V žádném případě nemůžete třídit podle prvku v poli pomocí funkce find. Existuje však případ, kdy to můžete provést 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"
}}
])
Takže v podstatě po provedení $match
podmínku pro dokumenty, které obsahovaly příslušnou shodu, pak použijete $project
"uložte" původní dokument do _id
pole a $unwind
"kopie" pole "entit".
Další $match
"filtruje" obsah pole pouze na ty, které jsou relevantní. Poté použijete $sort
na "spárované" dokumenty.
Protože "originální" dokument byl uložen pod _id
, používáte $project
k "obnovení" struktury, kterou dokument ve skutečnosti musel začínat.
To je způsob, jakým „třídíte“ podle vašeho shodného prvku pole.
Všimněte si, že pokud měli jste více "shod" v poli pro nadřazený dokument, pak byste museli použít další $group
fázi, abyste získali maximální hodnotu $ pro pole „relevance“, aby bylo možné dokončit řazení.