Vova
Дайте пример запроса с lookup + distinct
Давай пример документов твоих
CybernatiC
Давай пример документов твоих
return Message.distinct('username').aggregate([ { $match: { $or : [ {username: req.query.id}, {send_to: req.query.id} ]} }, { $lookup: { from: User.collection.name, localField: 'username', foreignField: 'username', as: 'UProfile' } } ]).exec(function(err, users){ if (!err) { return res.send(users); } else { res.statusCode = 500; log.error('Internal error(%d): %s',res.statusCode,err.message); return res.send({ error: 'Server error' }); } });
CybernatiC
Я делаю так
CybernatiC
Ошибка мол DISTINCT не существует
CybernatiC
если убрать distinct получаю всю переписку
CybernatiC
а мне надо только получить последние уникальные сообщения
CybernatiC
то есть по сути создать список моих чатов (с разными людьми)
CybernatiC
[{ _id: "5d99c646ef35e17e49fe481e", message: "😄😄😄😄", send_to: "Tester", username: "5", create_at: "2019-10-06T10:47:34.558Z", __v: 0, UProfile: [ { _id: "5d99c360482ed1dc8763658b", username: "5", __v: 0, socket_id: "FTVbOop5T6j3823fAAAB", id: "5", is_online: true, profile: { phone_number: "+545465", surname: "Berdiev", name: "Fayozjon", id: 5 } } ] },...
CybernatiC
Вот такие ответы получаю
Vova
если убрать distinct получаю всю переписку
Я думаю что в твоём случае надо использовать $group
Vova
А как сделать выборку?
https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#join-conditions-and-uncorrelated-sub-queries это немного другой формат $lookup
Vova
Там в pipeline идёт массив таких же преобразований по типу $match: { $or : [ {username: req.query.id}, {send_to: req.query.id} ]}
CybernatiC
Спасибо сейчас попробую
CybernatiC
В пайплайне указать дистинкт? Или груп?
Господин бумага
привет. можно ли как то сделать несколько запросов к базе и только после отработки всех выдать ответ?
Виктор
привет. можно ли как то сделать несколько запросов к базе и только после отработки всех выдать ответ?
Да, последовательно либо асинхронно, либо через aggregate (на сколько я знаю, там что угодно можно сделать)
Sardor
Почитай про bulk operation или aggregation
CybernatiC
Либо promise
Denis
привет. можно ли как то сделать несколько запросов к базе и только после отработки всех выдать ответ?
Наверное будет проще если ты скажешь что ты хочешь сделать / скинешь код
Vova
Не смог найти ничего по distinct
Его нет в aggregation. $group вроде юзается
CybernatiC
Непонятно как работает group
CybernatiC
Message.aggregate([ { $match: { $or : [ {username: req.query.id}, {send_to: req.query.id} ]} }, { $lookup: { from: User.collection.name, localField: 'username', foreignField: 'username', as: 'UProfile' } }, { $group:{ _id: null, username: { $last: 1 } } } ])
CybernatiC
Так?
Nick
Так?
в _id указывается по чему групппировать, в вашем случаем нулл - константа и группировка будет сразу по всем данным. Если указать какойнить "$name" то будет производитсья группировака по именам. в терминах SQL это список колонок для group by, если так проще понять
CybernatiC
$username указать ?
CybernatiC
или "$username"
CybernatiC
Алилйуя))
CybernatiC
но почему то UProfile пустой
CybernatiC
то есть Join не сработал)
Nick
уберите стейдж с группировкой
Nick
и посмотрите сработал ли лукап
CybernatiC
да все спасибо)
CybernatiC
переместил на ПОСЛЕ
CybernatiC
ой
CybernatiC
нет)
CybernatiC
пусто)
CybernatiC
Без груп
CybernatiC
работает
Nick
смотрите уровни вложенности
Nick
как построен док
CybernatiC
в group надо указать поля?
Nick
в группировке нужзно будет это вытащить явно
Nick
так же как вы делали с ласт
CybernatiC
спасибо большое) простите за нубские вопросы, только учусь)
Nick
на то этот чат и есть
Nick
можете еще раз свою задачу описать?
CybernatiC
можете еще раз свою задачу описать?
Собрать список ПЕРЕПИСОК (как в телеграме) исходя из коллекции СООБЩЕНИЯ
Nick
а переписки - это просто с какими людьми был диалог? или еще и с сообщениями?
CybernatiC
диалоги
CybernatiC
то есть у меня коллекция со всеми сообщениями находится в одном месте
CybernatiC
нет списка чатов отдельно
CybernatiC
я думал обойдусь join ом
Nick
и судя по всему вам нужно еще дополнить все профилем юзера с которым есть диалог?
CybernatiC
да
CybernatiC
для начала я получил список DISTINCT
CybernatiC
но сейчас переписал на aggregate
Nick
сейчас у вас матч, групп, потом лукап или как выше?
Nick
Message.aggregate([ { $match: { $or : [ {username: req.query.id}, {send_to: req.query.id} ]} }, { $lookup: { from: User.collection.name, localField: 'username', foreignField: 'username', as: 'UProfile' } }, { $group:{ _id: null, username: { $last: 1 } } } ])
тот порядок что здесь приведт к выборке всех сообщений, потом к каждому сообщению будет выполнен поиск юзера, и уже после этого все это будет ужиматься до юзеров т.е. если в выборку мессадже попоадет 1кк сообщений, то будет 1кк лукапов - что дорого
CybernatiC
вот как правильно поступить
Nick
тогда нужно переставить местами стейджи матч груп лукап
Nick
после группировки у вас должен быть просто список имен
CybernatiC
из за того что localField отсуствует LOOKUP не срабатывает кажется
CybernatiC
``` { _id: "19490", UProfile: [] }, { _id: "Tester", UProfile: [] }, { _id: "5", UProfile: [] }
CybernatiC
выводится это
CybernatiC
Вот я дурак)
CybernatiC
сравнивал по username а там же _id )
CybernatiC
все спасибо
CybernatiC
сделал что надо
CybernatiC
$lookup можно сделать лимит 1 ?
CybernatiC
а то вложенность получается {_id:..,proile:[[:{id.....}]]
CybernatiC
как избавится от 0 - Вложенности в Profile
Nick
как избавится от 0 - Вложенности в Profile
думаю вам этот приер поможет https://docs.mongodb.com/manual/reference/operator/aggregation/mergeObjects/ db.orders.aggregate([ { $lookup: { from: "items", localField: "item", // field in the orders collection foreignField: "item", // field in the items collection as: "fromItems" } }, { $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$fromItems", 0 ] }, "$$ROOT" ] } } }, { $project: { fromItems: 0 } } ])
Imran
ребята, помогите плиз. Как поставить моногодб на vdn сервер для ос centos 7