Задать вопрос
@Tshmt

Как выбрать уникальные переписки mongo?

Всем привет.
Есть коллекция messages:
в ней лежат много документов по типу:
_id:5d91fb7da4ed665ef5d691a3
body:"hello from me"
author:5d91facba4ed665ef5d6919c
target:5d91facba4ed665ef5d6222e
created_at:2019-09-30T12:56:29.342+00:00
__v:0

_id:5d91fb7da4ed665ef5d691a4
body:"hello from some user"
author:5d91facba4ed665ef5d6222e
target:5d91facba4ed665ef5d6919c
created_at:2019-09-30T12:56:29.342+00:00
__v:0

Я залогиненый юзер и мой id = 5d91facba4ed665ef5d6919c. Мне надо выбрать сообщения которые связаны со мной.
я делаю match
{
  $or: [
    { target: ObjectId('5d91facba4ed665ef5d6919c') },
    { author: ObjectId('5d91facba4ed665ef5d6919c') }]
}

и получаю все сообщения которыя я писал кому-то или мне писал кто-то.

Вопрос: Как мне дальше строить пайплайн что-бы выбрать уникальных собеседников, не повторяющихся и с последним сообщением от меня или от собеседника ?

делаю подобный функционал:

oL8R8U2.png

uniqUsers = [ ...new Set(messages.map(el => el.author === '5d91facba4ed665ef5d6919c' ? el.target : el.author )) ]

получил допустим уникальные id тех кто со мной переписывался.
дальше не знаю как лучше...
  • Вопрос задан
  • 63 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@grinat
Не надо уникальные id в массив собирать, читай про агрегацию. Дальше нужно просто $group по полям от кого/кому. Если тебе последняя переписка нужно, то сделай коллекцию диалог к примеру, и при добавлении сообщений, добавляй туда в lastMessage последнее сообщение и тогда будешь дергать только коллекцию. Как бы монга это не про нормальные формы, избыточные и дублирующиеся данные это норм. Если тебя нужна схемалес, нормальные формы и масштабирование, то бери графовую бд, навроде neo4j
Ответ написан
@Tshmt Автор вопроса
Додумался, то что нужно, всего 1 group

{
  _id: { $cond: [ {$eq:["$author",ObjectId('5d91facba4ed665ef5d6919c')]}, "$target", "$author" ] },
  lastMessage: { $last: "$body" },
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы