Рассчитать DAU / MAU из событий mongodb - PullRequest
1 голос
/ 29 марта 2020

Вот как это выглядит на данный момент:

  collection.aggregate(
    [
      {
        $match: {
          ct: {$gte: dateFrom, $lt: dateTo },
        }
      },
      {
        $group: { 
          _id: '$user'
        }
      }
    ]
  ).toArray((err, result) => {
    callback(err, result.length)
  });

Это дает мне список таких пользователей, которых я могу посчитать для DAU / MAU:

Но я думаю, что это не так эффективный, как правильно это сделать?

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

Вы можете использовать агрегацию ниже для уникальных активных пользователей по дням и месяцам. Я принял в качестве поля метки времени ct.

db.collection.aggregate(
[
  {"$match":{"ct":{"$gte":dateFrom,"$lt":dateTo}}},
  {"$facet":{
    "dau":[
      {"$group":{
        "_id":{
          "user":"$user",
          "ymd":{"$dateToString":{"format":"%Y-%m-%d","date":"$ct"}}
        }
      }},
      {"$group":{"_id":"$_id.ymd","dau":{"$sum":1}}}
    ],
    "mau":[
      {"$group":{
        "_id":{
          "user":"$user",
          "ym":{"$dateToString":{"format":"%Y-%m","date":"$ct"}}
        }
      }},
      {"$group":{"_id":"$_id.ym","mau":{"$sum":1}}}
    ]
  }}
])

DAU

db.collection.aggregate(
[
  {"$match":{"ct":{"$gte":dateFrom,"$lt":dateTo}}},
  {"$group":{
     "_id":{
        "user":"$user",
        "ymd":{"$dateToString":{"format":"%Y-%m-%d","date":"$ct"}}
      }
   }},
   {"$group":{"_id":"$_id.ymd","dau":{"$sum":1}}}
])

MAU

db.collection.aggregate(
[
  {"$match":{"ct":{"$gte":dateFrom,"$lt":dateTo}}},
  {"$group":{
     "_id":{
       "user":"$user",
       "ym":{"$dateToString":{"format":"%Y-%m","date":"$ct"}}
     }
  }},
  {"$group":{"_id":"$_id.ym","mau":{"$sum":1}}}
])
1 голос
/ 02 апреля 2020

Вы можете использовать сумму во время группы.

collection.aggregate([
    { $match: {'date': {$gte: dateFrom, $lt: dateTo }}}, // fetch all requests from/to 
    { $group: { _id: '$user', total: { $sum: 1 }}}, // group all requests by user and sum the count of collection for a group
    { $sort: { total: -1 }}
  ], function (err, result) {
      if (err) cb(err, null);
      cb(null, result);
  });
1 голос
/ 02 апреля 2020

Я провел быстрый тест для большой базы данных событий, и подсчет с отличным намного быстрее, чем агрегат, если у вас есть правильные индексы:

collection.distinct('user', { ct: { $gte: dateFrom, $lt: dateTo } }).length
...