同一列mongodb上有多个条件

时间:2019-09-25 06:44:16

标签: mongodb mongodb-query

{
    "_id" : ObjectId("5ccfe06e2434de5c345d058e"),
        "user_id" : 1,
    "event" : "eventA",
    "channel_id" : "1098",
    "channel_node_id" : "2177",
    "channel_name" : "New work",
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000"),
    "user_raw_data" : {
        "Name" : "akhilesh",
        "Mobile" : "1234567890",
        "Email" : "akhilesh@test.com"
},

{
    "_id" : ObjectId("5ccfe06e2434de5c345d058e"),
        "user_id" : 1
    "event" : "eventB,
    "channel_id" : "1098",
    "channel_node_id" : "2177",
    "channel_name" : "New work",
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000"),
    "user_raw_data" : {
        "Name" : "akhilesh",
        "Mobile" : "1234567890",
        "Email" : "akhilesh@test.com"
},
{
    "_id" : ObjectId("5ccfe06e2434de5c345d058e"),
        "user_id" : 1
    "event" : "eventC,
    "channel_id" : "1098",
    "channel_node_id" : "2178",
    "channel_name" : "New work",
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000"),
    "user_raw_data" : {
        "Name" : "akhilesh",
        "Mobile" : "1234567890",
        "Email" : "akhilesh@test.com"
}
,
{
    "_id" : ObjectId("5ccfe06e2434de5c345d058e"),
        "user_id" : 2
    "event" : "eventA,
    "channel_id" : "1098",
    "channel_node_id" : "2178",
    "channel_name" : "New work",
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000"),
    "user_raw_data" : {
        "Name" : "akhilesh",
        "Mobile" : "1234567890",
        "Email" : "akhilesh@test.com"
}

现在,我想获取到目前为止用户执行的事件计数。对于eventA,count为2,对于eventB 1,对于eventC为1。但是此查询将具有多个条件,因此,只有在用户执行了(eventA或eventB)和eventC时,我的条件才得到计数。因此,在那种情况下,由于没有执行doc用户ID 2事件,因此不会考虑该事件,因为它们未执行(eventA或eventB)

还要将事件与多重或条件匹配,我也想对user_raw_data应用过滤器,因此我的查询应该像这样

 db.web_channel_events.aggregate([
  {
    $match: {
      "channel_id": "1098",
      "channel_node_id": "2177"
    }
  },
  {
    $group: {
      "_id": {
        "user_id": "$user_id",
        "event": "$event"
      },
      "count": {
        $sum: 1
      }
    }
  },
  {
    $group: {
      "_id": "$_id.user_id",
      "event_details": {
        $push: {
          "k": "$_id.event",
          "v": "$count"
        }
      }
    }
  },
  {
    $match: {
      $and: [
        {
          $or: [
            {
              "event_details.k": "eventA",
              "event_details.v": {
                "$gte": 1
              }
            },
            {
              "event_details.k": "eventB",
              "event_details.v": {
                "$gte": 1
              }
            }
          ]
        },
        {
          "event_details.k": "eventC",
          "event_details.v": {
            "$gte": 1
          }
        },
        {
          "user_raw_data.Name": "akhilesh"
        }
      ]
    }
  },
  {
    "$unwind": "$event_details"
  },
  {
    $group: {
      "_id": "$event_details.k",
      "count": {
        $sum: "$event_details.v"
      }
    }
  }
]).pretty();

1 个答案:

答案 0 :(得分:0)

以下查询可以为我们提供预期的输出:

db.collection.aggregate([
    {
        $group:{
            "_id":{
                "user_id":"$user_id",
                "event":"$event"
            },
            "user_id":{
                $first:"$user_id"
            },
            "event":{
                $first:"$event"
            },
            "count":{
                $sum:1
            }
        }
    },
    {
        $group:{
            "_id":"$user_id",
            "user_id":{
                $first:"$user_id"
            },
            "event_details":{
                $push:{
                    "k":"$event",
                    "v":"$count"
                }
            }
        }
    },
    {
        $addFields:{
            "event_details":{
                $arrayToObject:"$event_details"
            }
        }
    },
    {
        $match:{
            $and:[
                {
                    $or:[
                        {
                            "event_details.eventA":{
                                $gt:0
                            }
                        },
                        {
                            "event_details.eventB":{
                                $gt:0
                            }
                        }
                    ]
                },
                {
                    "event_details.eventC":{
                        $gt:0
                    }
                }
            ]
        }
    },
    {
        $group:{
            "_id":null,
            "eventA":{
                $sum:"$event_details.eventA"
            },
            "eventB":{
                $sum:"$event_details.eventB"
            },
            "eventC":{
                $sum:"$event_details.eventC"
            }
        }
    },
    {
        $project:{
            "_id":0,
            "event_details.eventA":"$eventA",
            "event_details.eventB":"$eventB",
            "event_details.eventC":"$eventC"   
        }
    }
]).pretty()

数据集:

{
    "_id" : ObjectId("5ccfe06e2434de5c345d0588"),
    "event" : "eventA",
    "user_id" : 1,
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000")
}
{
    "_id" : ObjectId("5d8b132388edcf85b0aaa609"),
    "event" : "eventA",
    "user_id" : 1,
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000")
}
{
    "_id" : ObjectId("5d8b132388edcf85b0aaa60a"),
    "event" : "eventB",
    "user_id" : 1,
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000")
}
{
    "_id" : ObjectId("5d8b132388edcf85b0aaa60b"),
    "event" : "eventC",
    "user_id" : 1,
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000")
}
{
    "_id" : ObjectId("5d8b132388edcf85b0aaa60c"),
    "event" : "eventC",
    "user_id" : 1,
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000")
}
{
    "_id" : ObjectId("5d8b132388edcf85b0aaa60d"),
    "event" : "eventC",
    "user_id" : 2,
    "created_at" : NumberLong("1557127278000"),
    "updated_at" : NumberLong("1557127278000")
}

输出:

{ "event_details" : { "eventA" : 2, "eventB" : 1, "eventC" : 2 } }

查询分析:

  • 根据user_idevent对数据进行分组并计算该特定事件的计数
  • 仅基于user_id和推送事件及其事件进行分组 作为键值对计入数组event_details
  • event_details转换为对象
  • 应用事件计数(A或B)和C的条件 应该大于0
  • 总结单个事件的计数
相关问题