mongodb - 基于某些条件的两个字段的总和

标签 mongodb mongodb-query aggregation-framework

这些是我在 Stat 集合中的文档:

{placeid: 'plaza', guestid: "xxx", logtype: "purchase", value: 12}
{placeid: 'plaza', guestid: "xxx", logtype: "visit", value: 0}
{placeid: 'plaza', guestid: "xxx", logtype: "purchase", value: 17}
{placeid: 'plaza', guestid: "yyy", logtype: "visit", value: 0}  

我想聚合这些文档以获取信息(传递 plaza 作为参数):

  • xxx 访问次数:1,购买次数:2,购买金额为 29
  • yyy 访问:1,购买:0,购买值(value)为 0

这是我的方法:

Stat.aggregate(
        [
            { $match: { placeid: "plaza" } },
            {
                $group: {
                    _id: "$guestid",
                    totallogs: { $sum: 1 },
                    totalvalue: { $sum: "$value" },
                }
            }
        ]
)  

这里的问题是这个聚合没有考虑logtype

而且我不知道如何改进它。有什么帮助吗?

最佳答案

您需要使用聚合框架来$group您的文档按“guestid”并使用 $sum累加器运算符返回总和。当然你还需要 $cond运算符评估“logtype”的值并返回“true case”的值。

db.Stat.aggregate([
    { "$match": { "placeid": "plaza" } },
    { "$group": { 
        "_id": "$guestid", 
        "visit": { 
            "$sum": { 
                "$cond": [ 
                    { "$eq": [ "$logtype", "visit" ] }, 
                    1, 
                    0 
                ] 
            } 
         }, 
         "purchases": { 
             "$sum": { 
                  "$cond": [ 
                      { "$eq": [ "$logtype", "purchase" ] }, 
                      1, 
                      0 
                  ] 
             } 
        }, 
        "value_purchase": { 
            "$sum": {
                "$cond": [ 
                    { "$eq": [ "$logtype",   "purchase" ] },
                    "$value", 
                    0 
                ]  
            } 
        }  
    }}
])

产生:

{ "_id" : "yyy", "visit" : 1, "purchases" : 0, "value_purchase" : 0 }
{ "_id" : "xxx", "visit" : 1, "purchases" : 2, "value_purchase" : 29 }

关于mongodb - 基于某些条件的两个字段的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37372030/

相关文章:

MongoDb.展平内部数组

mongodb - 使用 where 条件聚合查询

mongodb - $text 搜索可以执行部分​​匹配吗

javascript - 选择嵌套数组对象并替换它

mongodb - 获取具有完全相同 key 的文档

mongodb - 读取数据库: not authorized in mongo DB错误如何解决

node.js - 如何在mongodb中过滤两次之间的数据

mongodb - $geoNear - mongodb 聚合中的 $maxDistance 不起作用

mongodb - 在同一聚合中聚合小计和应税小计

ruby-on-rails - 使用 Mongo Mapper 的 Rails