我在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'}
}
});
完美,现在我已经通过相关下降到所有类型“人”和值“尼利·克罗斯”的实体记录进行排序。
我尝试了一个正常的“排序”,但是,作为关于$ elemMatch中的sort()的manual said,结果可能不会反映排序顺序,因为sort()是在数组之前应用于数组的元素$ elemMatch投影。
事实上,_id:987456321将是第一个(相关度为0.96,但提及ICANN)。
我该怎么办,通过匹配的子文档的相关性对我的文档进行排序?
P.S .:我无法更改文档结构。
这是作为一个工具的转储出来,或者这是你的文件在mongo shell中的实际外观?我这样说是因为你如何表示“实体”是作为“子文档”而不是数组。这些不能通过任何标准手段进行分类。 –