dmc1989
@dmc1989

Как правильно обратиться к массиву в Mongoose?

Есть схема сообщений, в которой хранятся все сообщения от пользователей.

У каждого пользователя есть массив диалогов (переписок), в каждом из которых хранятся id сообщений. В схеме выглядит следующим образом:
dialogues: [{
        name: mongoose.Schema.Types.ObjectId, // contain order id
        messages: [{
            id: {
                type: mongoose.Schema.Types.ObjectId
            }, // contain message id
            properties: {
                hidden: {
                    type: Boolean,
                    default: false
                },
                new: {
                    type: Boolean,
                    default: true
                }
            }
        }]
    }]

Когда сообщение записывается к общим сообщениям, вызывается функция для отправителя и получателя, которая записывает в их переписки, id этого сообщения. Вот функция:
function insertUserMessages(userId, dialogTitle, message) {
    User.findById(userId, function(err, user) {
        
        User.update(
            {dialogues: { $elemMatch: { name: dialogTitle } } },
            { $push: { "dialogues.messages": message } }, 
            { safe: true, upsert: true }, 
            function(err, result) {
                if (err) console.log(err);
            }
        );
        
    });
}

Вопрос: как правильно осуществить запись?
  • Вопрос задан
  • 385 просмотров
Решения вопроса 1
dmc1989
@dmc1989 Автор вопроса
Решение было таким:
Диалоги у пользователя хранятся в таком виде
"dialogues" : {
        "58f9e5ff408da70504fede05" : [   // <----    человек по-переписке
            {
                "id" : ObjectId("590880f1c612893834123438") // <----   id сообщения, здесь могут быть дополнительные 
            },                                              // параметры. Например, скрыл ли его пользователь.
            ...
        ],
        "58f9fcb6794ac63bf44bd61c" : [ 
            {
                "id" : ObjectId("5908a3470d59a45a64715bb2")
            }, 
            ...
        ]
}

В схеме пользователя это пустой объект
dialogues: { }

Для сообщений существует отдельная коллекция.

После сохранения в коллекцию сообщений, отправителю и получателю в диалог к новой, или уже существующей переписке записывается id этого сообщения
User.findByIdAndUpdate(
    userId, 
    {$push: {['dialogues.' + message.recipient]: {id: message._id}} }, 
    { safe: true, upsert: true }, 
    function(err, user) {       
        if (err) console.log(err);
    }
);


Вроде работает...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@emp1re
Не претендую на правильность, но я бы делал отдельную колекцию для диалогов.

_id : mongoid,
author: userId,
recipient: userId,
message: [{
 author: userId,
 text: "",
 timestamps: true
}]


Каждый документ это "диалог" знаем кто создавал и кому был направлен(можно расширить). Все история с хронологией этого диалога, простые запросы. Для того что бы получать юзера из userId смотрим в сторону $lookup.

Ваш вопрос не понял до конца, вы хотите проверить свой вариант? Думаю по результату работы и так ясно.
Ответ написан
Ваш ответ на вопрос

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

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