这些是我在 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,购买次数为 0

  • 这是我的方法:
    Stat.aggregate(
            [
                { $match: { placeid: "plaza" } },
                {
                    $group: {
                        _id: "$guestid",
                        totallogs: { $sum: 1 },
                        totalvalue: { $sum: "$value" },
                    }
                }
            ]
    )
    

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

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

    最佳答案

    您需要使用聚合框架通过“guestid”来 $group 您的文档,并使用 $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/

    10-16 20:50