MongoDB: Oppdatere et array av objekter

MongoDB: Oppdatere et array av objekter

I MongoDB ender man ganske ofte opp med å ha dokumenter som inneholder array av objekter. Disse kan det noen ganger være vanskelig å skjønne hvordan man oppdaterer.

Her har jeg laget en bitteliten howto, også til meg selv :)

La oss si at jeg har en collection som heter blog og inneholder mine fine blogg-artikler.

Liste ut alle artiklene
db.blog.find().pretty()
[
    {
        title: 'My life',
        images: [
            {
                id: 1,
                title: 'Image of my home',
                tags: ['home'],
                src: '/tmp/image-1.jpg',
            },
            {
                id: 4,
                title: 'Image of my cabin',
                tags: ['cabin'],
                src: '/tmp/image-2.jpg',
            }
        ]
    },
    {
        title: 'My cat',
        images: [
            {
                id: 1,
                title: 'Image of my home',
                tags: ['home'],
                src: '/tmp/image-1.jpg',
            },
            {
                id: 9,
                title: 'Image of my cat',
                tags: ['cat'],
                src: '/tmp/image-3.jpg',
            }
        ]
    }
]

Nå ønsker jeg å oppdatere title på alle bildene med id = 1. Hvordan gjør jeg det enklest mulig?

Her kommer MongoDB til unnsetning med sin fine $ operator.

Oppdatere bildene med id = 1
db.blog.update({
        "img.id": 1
    }, {
        $set: {
            "img.$.title": "Home sweet home"
        },
        $addToSet: {
            "img.$.tags": [ "sweet", "home" ]
        }
    });

TIPS!

Dersom du bruker Mongoose og ønsker å gjøre dette i applikasjonen din, så må du aksessere native-mongo-modulen direkte.

Du finner alle native funksjoner i modellen sin collection variabel.

Model.collection.updateMany({
        "img.id": 1
    }, {
        $set: {
            "img.$.title": "Home sweet home"
        },
        $addToSet: {
            "img.$.tags": [ "sweet", "home" ]
        }
    });