kotcich
@kotcich
Я скучный.

Как посчитать количество непрочитанных сообщений с aggregate в моем случаи?

Вот песочница

Я получаю последние записи в каждой паре roommates: [1, x].
Мне бы хотелось получать все то же самое, но только теперь, к каждой записи должно добавиться поле вида field: x: где field, это любое название поля, а x, это количество всех записей уникальной пары [1, x] с полем viewed: false.
Как это сделать?

Вот пример вывода, который я хочу (он скопирован из песочницы, я просто добавил нужный мне ключ):
[
  {
    "_id": [
      1,
      2
    ],
    "created_at": NumberLong(1661152555),
    "target": 1,
    "text": "5",
    "user": 2,
    "viewed": false,
    "news": 1
  },
  {
    "_id": [
      1,
      5
    ],
    "created_at": NumberLong(1661152450),
    "target": 1,
    "text": "4",
    "user": 5,
    "viewed": false,
    "news": 2
  }
]
  • Вопрос задан
  • 23 просмотра
Решения вопроса 1
Как то так: добавил $addFields stage, и count в $group

db.collection.aggregate([
  {
    "$match": {
      "roommates": {
        "$in": [
          1
        ]
      }
    }
  },
  {
    "$sort": {
      "created_at": -1
    },
    
  },
  {
    "$addFields": {
      "to_sum": {
        "$cond": {
          "if": "$viewed",
          "then": 0,
          "else": 1,          
        }
      }
    },
  },
  {
    "$group": {
      "_id": "$roommates",
      "user": {
        "$first": "$user"
      },
      "target": {
        "$first": "$target"
      },
      "text": {
        "$first": "$text"
      },
      "created_at": {
        "$first": "$created_at"
      },
      "viewed": {
        "$first": "$viewed"
      },
      "count": {
        "$sum": "$to_sum"
      }
    }
  },
  {
    "$sort": {
      "created_at": -1
    },
    
  },
  {
    "$limit": 25
  }
])
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы