我有这个消息集合,由4个字段组成-- _id、conversationId、message。在我的消息控制器中,每次用户单击特定用户时,后端都会将具有相同conversationId的消息列表发送到前端(ReactJS)。在前端,消息列表将通过将seen的值从false更改为true来修改。然后我打算把这个传给后端。我的问题是,如何只修改具有相同conversationId的所有数据而不替换消息集合中的所有数据?
控制器,它将获取所有具有相同conversationID的消息
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
}
]前端函数,它将改变已见的值
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 });
}
};发布于 2021-10-19 13:16:39
可以使用Model.updateMany更新集合中的多个文档。
export const seenMessageById = async (req, res) => {
try {
if (Array.isArray(req.body) && req.body.length > 0) {
const idList = req.body.map( message => message._id);
const result = await messageModel.updateMany({ _id: { $in: idList }}, { seen: true });
res.status(200).json({ msg: `Total ${result.nModified} documents updated` });
} else {
res.status(400).json({ msg: 'Atleast 1 message required to update.' });
}
} catch (error) {
res.status(500).json({ msg: error.message });
}
};https://stackoverflow.com/questions/69630859
复制相似问题