【发布时间】:2021-10-19 21:23:08
【问题描述】:
我有这个由 4 个字段组成的消息集合 _id、conversationId、message、seen。在我的消息控制器中,每次用户单击特定用户时,后端都会将具有相同会话 ID 的消息列表发送到前端(reactJS)。在前端,消息列表将通过将 seen 的值从 false 更改为 true 来修改。然后我打算将它传递给后端。我的问题是如何只修改具有相同会话 ID 的所有数据而不替换消息集合中的所有数据
将获取所有具有相同会话 ID 的消息的控制器
export const getMessage = async (req, res) => {
try {
const message = await messageModel
.find({
conversationId: req.params.messageId,
})
.populate('senderId');
res.status(200).json(message);
} catch (error) {
res.status(500).json({ msg: error.message });
}
};
返回值
[
{
_id: '616d76e858abdc3fa4059ee3',
conversationId: '61696e3ed94cd23f8c22f75a',
message: 'Sample One',
seen: false
},
{
_id: '616d779458abdc3fa4059f53',
conversationId: '61696e3ed94cd23f8c22f75a',
message: 'Sample Two',
seen: false
}
]
会改变 seen 值的前端函数
const handleUpdateSeen= (conversation) => {
dispatch(updateTaskSeenById(conversation));
};
将发送到后端的值以及我想在 messageCollection 上更改的输出
[
{
_id: '616d76e858abdc3fa4059ee3',
conversationId: '61696e3ed94cd23f8c22f75a',
message: 'Sample One',
seen: true
},
{
_id: '616d779458abdc3fa4059f53',
conversationId: '61696e3ed94cd23f8c22f75a',
message: 'Sample Two',
seen: true
}
]
我提出的解决方案
export const updateMessageSeen = async (req, res) => {
try {
var updatedData;
for (let i = 0; i < req.body.length; i++) {
update = {
_id: req.body[i]._id,
conversationId: req.body[i].conversationId,
senderId: req.body[i].senderId._id,
messageText: req.body[i].messageText,
messageMedia: req.body[i].messageMedia,
seen: req.body[i].seen,
createdAt: req.body[i].createdAt,
};
}
await messageModel.updateMany(
{ conversationId: req.params.conversationId },
updatedData
);
} catch (error) {
res.status(500).json({ msg: error.message });
}
};
【问题讨论】: