简体   繁体   中英

Updating nested MongoDB document object

Hello there, a quick MongoDB mixed with some Discord knowledge question:

So currently, I want a formation for my MongoDB Document similar to the following:

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

This saves channel IDs so users can decide where each event will be logged. I have this set up in the schema and all good, but when I do findOneAndUpdate I don't know how to edit a single field; for example, let's say I want to edit roleDelete which is inside channels.logging.role how would I do that? because doing

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

It does not work. In fact, it screws everything up and replaces everything within channels to the value given, so how would I go around actually updating ONE value without messing with everything else? Thank you so much for your attention and participation.

This is using NodeJS Mongoose NPM Package btw.

you need to use $set operator. you can find details on https://docs.mongodb.com/manual/reference/operator/update/set/index.html

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

So I solved this by doing the following:

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

This updated the value if it existed and created it if it didn't exist. Using the above methods uses $set internally. ( Read more here )

Feel free to ask if I didn't make myself clear

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM