更新嵌套的 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 文档对象的主要内容,如果未能解决你的问题,请参考以下文章
找不到 id 并更新和增加子文档 - 返回 null Mongoose/mongoDB