首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB:统计OR条件查询的匹配数

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

Stack Overflow用户
提问于 2018-03-25 09:42:47
回答 1查看 166关注 0票数 2

给定一个包含嵌套文档的MongoDB

代码语言:javascript
复制
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条件的查询

代码语言:javascript
复制
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“不是有效语法。

代码语言:javascript
复制
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版本有更优雅或更快的解决方案,我也会感兴趣。

EN

回答 1

Stack Overflow用户

发布于 2018-03-25 11:00:19

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

  • 执行$match
  • 为每个比例(matchA,matchB,matchC)创建匹配项
  • 求和匹配项
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49471730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档