#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
Я пытаюсь найти решение, в котором я могу вернуть список последних чатов между 2 пользователями с их последним сообщением в нем. Я просмотрел несколько статей и увидел, что с помощью aggregate я смогу добиться этого. Однако, попробовав приведенный ниже код, я все равно получаю дополнительный / дублирующий документ. Могу ли я в любом случае отфильтровать это еще больше, чтобы убедиться, что на человека ПРИХОДИТСЯ ТОЛЬКО 1 документ (туда или обратно)
Chat.aggregate(
[{ $match: { $or: [{ "sender._id": senderId }, { "reciever._id": senderId }] } },
{ $sort: { time: -1 } },
{
$group: {
"_id": {
"last_message_between": {
$cond: [
{
$gt: [
{ $substr: ["$reciever._id", 0, 1] },
{ $substr: ["$sender._id", 0, 1] }]
},
{ $concat: ["$sender._id", " and ", "$reciever._id"] },
{ $concat: ["$reciever._id", " and ", "$sender._id"] }
]
}
},
"message": { $first: "$$ROOT" }
}
}], function (err, data) {
if (err || !data) {
res.status(400).json({
error: err,
});
}
res.json(data);
})
Комментарии:
1. Вы неправильно пишете «приемник». Я не понимаю, сколько документов вы пытаетесь вернуть, 1 или более 1?
2. Также единственными двумя соответствующими тегами для этого вопроса являются mongodb и mongodb-query.
3. Я пытаюсь вернуть только 1 документ (последний), не имеет значения, кто отправляет сообщение, модель должна отправить обратно только один последний документ. в этом случае — модель должна отправлять только первый элемент, в котором он отправляет 2. Тот, в котором получатель отправил сообщение, а другой наоборот. Извинения за грамматическую ошибку исправят серверную часть 🙂
4. Почему $limit 1 после сортировки не работает?
5. Не работает . Например, скажем, есть 3 чата 1- A -> B 2. A -> C 3. B -> A С ограничением 1 Я получаю только один чат (A -> B).
Ответ №1:
Ваша идея сопоставить два идентификатора с $cond
была хорошей.
Но чтобы заставить его работать в каждом случае, вам просто нужно сравнить всю строку, а не только первые символы.
Попробуйте это здесь
db.collection.aggregate([
{
$match: {
$or: [
{
"sender._id": "user_1@gmail.com"
},
{
"receiver._id": "user_1@gmail.com"
}
]
}
},
{
$sort: {
time: -1
}
},
{
$group: {
"_id": {
"last_message_between": {
$cond: [
{
$gt: [
"$receiver._id",
"$sender._id"
]
},
{
$concat: [
"$sender._id",
" and ",
"$receiver._id"
]
},
{
$concat: [
"$receiver._id",
" and ",
"$sender._id"
]
}
]
}
},
"message": {
$first: "$$ROOT"
}
}
}
])
Комментарии:
1. Вы, сэр, абсолютная легенда. Сработало как шарм. Если в любом случае я мог бы угостить вас кофе, пожалуйста, дайте мне знать 🙂
2. Ахах, большое спасибо, но это не имело большого значения. Хорошего дня 🙂