给定带有嵌套文档的MongoDB
collection = client.test.or_example
new_documents = [
{'_id': 1, 'proportions':{'A': 0.3, 'B': 0.1}},
{'_id': 2, 'proportions':{'C': 0.3, 'D': 0.1}},
{'_id': 3, 'proportions':{'A': 0.3, 'C': 0.3}},
{'_id': 4, 'proportions':{'B': 0.1, 'D': 0.3}},
{'_id': 5, 'proportions':{'A': 0.1, 'B': 0.3}}]
collection.insert_many(new_documents)
我可以构造一个使用OR条件的查询
collection.find({'$or': [{'proportions.A': {'$gt': 0.2}},
{'proportions.B': {'$gt': 0.2}},
{'proportions.C': {'$gt': 0.2}}]}
返回四个文件(id为1,2,3,5)。现在我想根据它们满足的OR条件数对这些文档进行排序,分别为3,1,2,5(相应的匹配数2,1,1,1)。
我一直在尝试计算聚合管道中OR匹配的数量,但无法使其工作。我已设法创建一个相关字段“coverage”,但我目前尝试“number_matches”的语法无效。
results = collection.aggregate([
{
'$match': {'$or': [{'proportions.A': {'$gt': 0.2}},
{'proportions.B': {'$gt': 0.2}},
{'proportions.C': {'$gt': 0.2}}]}
},
{
'$addFields':
{
'coverage': {'$sum': [ '$proportions.A', '$proportions.B', '$proportions.C']},
'number_matches': {'$sum': [ {'cond': [{'proportions.A': {'$gt': 0.2}}, 1, 0]},
{'cond': [{'proportions.B': {'$gt': 0.2}}, 1, 0]},
{'cond': [{'proportions.C': {'$gt': 0.2}}, 1, 0]} ] }
}
},
{
'$sort': {'number_matches': -1}
}
])
此外,我目前的尝试感觉相当复杂,所以我希望可能有一种更简单的方法。
我正在寻找一个适用于MongoDB 3.4的解决方案,但是如果有一个更优雅或更快的3.6解决方案,我也会对此感兴趣。
答案 0 :(得分:0)
也许您需要添加一个中间步骤