【问题标题】:Updating nested MongoDB document object更新嵌套的 MongoDB 文档对象
【发布时间】:2021-02-13 05:50:51
【问题描述】:

你好,一个快速的 MongoDB 和一些 Discord 知识问题:

所以目前,我想要一个类似于以下内容的 MongoDB 文档格式:

channels: {
    utility:{
        suggestions: String
    },
    logging: {
        main: String,
        channel: {
            channelCreate: String,
            channelDelete: String,
            channelUpdate: String,
        },
        role: {
            roleCreate: String,
            roleDelete: String,
            roleUpdate: String,
        }
}

这会保存频道 ID,以便用户可以决定记录每个事件的位置。我在架构中设置了这个,一切都很好,但是当我做findOneAndUpdate 时,我不知道如何编辑单个字段;例如,假设我想编辑 roleDelete 里面的 channels.logging.role 我该怎么做?因为做

await doc.updateOne({channels:{logging:{role:{roleDelete: IDHERE}}}});

它不起作用。实际上,它将所有内容都搞砸了并将channels 中的所有内容替换为给定的值,那么我将如何在不弄乱其他所有内容的情况下实际更新ONE 值呢?非常感谢您的关注和参与。

顺便说一句,这是使用 NodeJS Mongoose NPM 包。

【问题讨论】:

    标签: javascript node.js mongodb mongoose discord


    【解决方案1】:

    所以我通过执行以下操作解决了这个问题:

    await doc.updateOne({ 'channels.logging.role.roleDelete': IDHERE}, { new: true, upsert: true, setDefaultsOnInsert: true });
    

    如果存在则更新该值,如果不存在则创建它。使用上述方法在内部使用$set。 (Read more here)

    如果我没有说清楚,请随意问

    【讨论】:

      【解决方案2】:

      您需要使用$set 运算符。你可以在https://docs.mongodb.com/manual/reference/operator/update/set/index.html找到详细信息

      doc.updateOne({ _id: ID }, {
              $set: {
                  channels.logging.role.roleDelete: IDHERE
              }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-08-04
        • 1970-01-01
        • 2020-03-17
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-19
        • 2017-03-06
        相关资源
        最近更新 更多