给定一个包含嵌套文档的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版本有更优雅或更快的解决方案,我也会感兴趣。
发布于 2018-03-25 11:00:19
也许你需要添加一个中间步骤
https://stackoverflow.com/questions/49471730
复制相似问题