Найти среднее количество событий - PullRequest
1 голос
/ 15 марта 2020

У меня есть коллекция событий, поэтому db.events содержит много:

{
    "_id" : ObjectId("5e56c7d0c0c979b198cbe21a"),
    "event" : "buy",
    "userId" : "u1",
    "itemId" : "iPhone 12",
}

Коллекция большая и содержит несколько типов событий, поэтому мне нужно использовать структуру агрегации. Мне нужно вычислить:

  • среднее уникальное itemId уникальное userId buy.

Чтобы быть понятным, мой вопрос, как принять среднее из полученных результатов. Мне нужен набор по существу userId: [itemId1, itemId2, ...], содержащий все userId из buy событий и itemId, сгруппированных по usereId. Я хочу усреднить количество уникальных itemId по всем userId.

1 Ответ

1 голос
/ 15 марта 2020

Попробуйте это:

db.events.aggregate([
  {
    $match: {
      event: "buy"
    }
  },
  {
    $group: {
      _id: "$userId",
      set: {
        $addToSet: "$itemId"
      }
    }
  },
  {
    $group: {
      _id: null,
      unique: {
        $sum: {
          $size: "$set"
        }
      },
      n: {
        $sum: 1
      }
    }
  },
  {
    $project: {
      _id: 0,
      avg: {
        $divide: [
          "$unique",
          "$n"
        ]
      }
    }
  }
])

MongoPlayground

...