在 mongodb 聚合管道中创建价格范围方面

Posted

技术标签:

【中文标题】在 mongodb 聚合管道中创建价格范围方面【英文标题】:Create a price range facet in mongodb aggregation pipeline 【发布时间】:2015-07-10 10:20:12 【问题描述】:

我的文档结构是这样的


title : 'a product',
price : 10

我想做的是一个看起来像这样的动态价格范围方面

[
        
            facet : '0-30',
            count : 5
        ,
        
            facet : '30-100',
            count : 40
        
]

显然会有一个固定的间隔,例如 50。我曾经让 ElasticSearch 使用 histogram 函数为我执行此操作,但我无法让它在 mongo 中工作。我想,可以做一个 map reduce 来完成它,但我想知道是否有一种方法可以添加到我的聚合管道中。

【问题讨论】:

【参考方案1】:

您可以尝试一个聚合管道,您可以在其中使用 $cond 运算符投影 facet 字段。为了证明这一点,假设您有一个包含以下文档的集合:

db.collection.insert([
     "title" : "Product STU", "price" : 10 ,
     "title" : "Product XYZ", "price" : 50 ,
     "title" : "Product PCT", "price" : 14 ,
     "title" : "Product DEF", "price" : 89 ,
     "title" : "Product DYQ", "price" : 34 ,
     "title" : "Product ABC", "price" : 40 ,
     "title" : "Product JKL", "price" : 50 ,
     "title" : "Product PQR", "price" : 75 ,
     "title" : "Product MNO", "price" : 81 ,
     "title" : "Product VWN", "price" : 5 ,
     "title" : "Product KLM", "price" : 63 
]);

将达到预期结果的聚合管道如下:

db.collection.aggregate([
    
        "$match": 
            "price":  "$lte": 100, "$gte": 0 
        
    ,
    
        "$project": 
            "title": 1,
            "price": 1,
            "_id": 0,
            "facet": 
                "$cond": [  "$gte": [ "$price", 30 ] , "30-100", "0-30" ]
            
        
    ,
    
        "$group": 
            "_id": "$facet",
            "count": 
                "$sum": 1
            
        
    ,
    
        "$project": 
            "facet": "$_id",
            "_id": 0,
            "count": 1
        
    
])

输出

/* 1 */

    "result" : [ 
        
            "count" : 8,
            "facet" : "30-100"
        , 
        
            "count" : 3,
            "facet" : "0-30"
        
    ],
    "ok" : 1

【讨论】:

这很好,但您需要手动输入 $cond。我所追求的是在给定固定间隔的情况下自动计算范围,就像 ElasticSearch 一样。要以您在演示中使用它们的方式获得范围,您需要事先以某种方式计算它,我想通过运行另一个查询 @mbouclas 如果你不需要最大值(例如,如果你对这样的事情没意见:“0-30”、“30-100”、“100+”),你不需要不需要另一个查询。您可以在单个聚合中执行此操作(请注意,您可以嵌套 $cond 运算符)。

以上是关于在 mongodb 聚合管道中创建价格范围方面的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb对来自聚合方面的两个相似数据数组进行分组和求和

走进MongoDB

mongodb Aggregation聚合操作之$facet

如何使用 C++ 在 MongoDB 中创建地理空间索引

如何使用 MongoDB 聚合管道从集合中的两个子文档中返回最小值?

MongoDB 在数组中创建数组