【问题标题】:How to update all the data that have same field without modify other data in mongoose?如何在不修改猫鼬中其他数据的情况下更新所有具有相同字段的数据?
【发布时间】: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 });
  }
};

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    您可以使用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 });
        }
    };
    

    【讨论】:

    • 先生,我尝试使用 updateMany 但我不知道为什么不起作用。我已经更新了我的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多