更新嵌套的 MongoDB 文档对象

Posted

技术标签:

【中文标题】更新嵌套的 MongoDB 文档对象【英文标题】:Updating nested MongoDB document object 【发布时间】: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 包。

【问题讨论】:

【参考方案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
        

【讨论】:

以上是关于更新嵌套的 MongoDB 文档对象的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb嵌套文档更新?

Mongodb嵌套文档的修改-利用数组修改器更新数据

更新 mongodb 中的嵌套文档

找不到 id 并更新和增加子文档 - 返回 null Mongoose/mongoDB

将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)

MongoDB更新对象值的嵌套对象[重复]