MongoDB:计算OR条件查询的匹配数

时间:2018-03-25 01:42:47

标签: mongodb mongodb-query

给定带有嵌套文档的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解决方案,我也会对此感兴趣。

1 个答案:

答案 0 :(得分:0)

也许您需要添加一个中间步骤

  • 执行$ match
  • 为每个比例(matchA,matchB,matchC)
  • 创建匹配项
  • 总结比赛