前述のように、ドキュメントに実際に配列が含まれていることを願っていますが、$ 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 コード>
関連する一致を含むドキュメントの条件として、<を使用します。 code> $ project
元のドキュメントを_id
に「保存」します フィールドと $ unwind
「エンティティ」配列の「コピー」。
次の $ match
配列の内容を、関連するものだけに「フィルタリング」します。次に、 $ sort
を適用します。
「一致した」ドキュメントに。
「元の」ドキュメントは_id
の下に保存されていたため 、 $ project
を使用します
ドキュメントが実際に最初に必要だった構造を「復元」するため。
これが、配列の一致した要素を「ソート」する方法です。
if 親ドキュメントの配列内に複数の「一致」がある場合は、追加の $ group
並べ替えを完了するために、「関連性」フィールドの$max値を取得するステージ。