У меня есть структура чата, в которой хранятся и все сообщения, и последнее сообщение в одном родительском документе (chat
). Когда пользователь отправляет сообщение, мне нужно обновить last_message
и добавить новое сообщение в массив messages
. Можно ли сделать это в одном обновлении, чтобы _id
, created_at
и updated_at
были одинаковыми в обоих поддокументах?
Вот моя попытка, которая не работает:
const message = {
content: req.body.contentg,
sender: sender.toObject(),
};
const chat = await Chat.findOneAndUpdate({
_id: toObjectId(req.params.chat_id),
status: 'active',
}, {
last_message: message,
$push: { messages: message },
}, {
new: true,
});
Обновление: Добавлены схемы (я использую ts-mon goose)
export const MessageSenderSchema = createSchema({
last_name: Type.string(),
first_name: Type.string(),
phone: Type.string({ required: true }),
email: Type.string(),
status: Type.string({ enum: UserStatuses, required: true }),
}, {
skipVersioning: true,
});
export const ChatMessageSchema = createSchema({
content: Type.string({ required: true }),
status: Type.string({ enum: ChatMessageStatuses, default: 'new' }),
sender: Type.schema({ require: true }).of(MessageSenderSchema),
});
ChatMessageSchema.set('timestamps', { createdAt: 'created_at', updatedAt: 'updated_at' });
export const ChatSchema = createSchema({
__v: Type.number({ select: false }),
status: Type.string({ enum: ChatStatuses, default: 'active', required: true }),
members: Type.array().of({
$ref: Type.string(),
$id: Type.objectId(),
$db: Type.string({ required: false }),
}),
messages: Type.array().of(ChatMessageSchema),
last_message: Type.schema().of(ChatMessageSchema),
});