У меня есть коллекция в MongoDB со сложной структурой и вложенными документами. документ имеет структуру, как это:MongoDB найти поддокумент и отсортировать результаты
doc1 = {
'_id': '12345678',
'url': "http//myurl/...",
'nlp':{
"status": "OK",
"entities": {
"0": {
"type" : "Person",
"relevance": "0.877245",
"text" : "Neelie Kroes"
},
"1": {
"type": "Company",
"relevance": "0.36242",
"text": "ICANN"
},
"2": {
"type": "Company",
"relevance": "0.265175",
"text": "IANA"
}
}
}
}
doc2 = {
'_id': '987456321',
'url': "http//myurl2/...",
'nlp':{
"status": "OK",
"entities": {
"0": {
"type": "Company",
"relevance": "0.96",
"text": "ICANN"
},
"1": {
"type" : "Person",
"relevance": "0.36242",
"text" : "Neelie Kroes"
},
"2": {
"type": "Company",
"relevance": "0.265175",
"text": "IANA"
}
}
}
}
Моя задача состоит в том, чтобы искать «типа» И «текст» внутри поддокументе, то сортировать по «значимости». С оператором $ elemMatch Я в состоянии выполнить запрос:
db.resource.find({
'nlp.entities': {
'$elemMatch': {'text': 'Neelie Kroes', 'type': 'Person'}
}
});
совершена, теперь я должен сортировать все записи с организациями типа «Person» и значение «Нила Kroes» по релевантности по убыванию.
Я пробовал с обычным «сортировкой», но, как manual said о sort() в $ elemMatch, результат может не отражать порядок сортировки, потому что sort() применялся к элементам массива до $ elemMatch проекция.
Фактически, _id: 987456321 будет первым (с релевантностью 0,96, но ссылка на ICANN).
Как это сделать, чтобы отсортировать документы, сопоставив релевантность поддокумента?
P.S .: Я не могу изменить структуру документа.
Выходит ли это из дампа из какого-то инструмента или это как ваш документ на самом деле выглядит в оболочке монго? Я говорю это, потому что, как вы представляете «сущности», это «под-документ», а не массив. Они не могут быть отсортированы по каким-либо стандартным средствам. –