MongoDB, voeg nieuw {field: value} toe in bestaand ingesloten document met puntnotatie met meerdere niveaus?

Wat ik probeer te doen is een nieuw {field: value} voor een blogbericht toevoegen. Als ik bijvoorbeeld vertoningen op websites zou willen bijhouden.blog_posts.url: 'http://www.example.com/01.html', hoe kan ik dat vertoningenkenmerk toevoegen voor die blogpost?

Mijn huidige documentstructuur:

{ 
email_address: '[email protected]', 
password: 'random_password',
first_name: 'John',
last_name: 'Doe',
user_type: 'WEBMASTER',
newsletter: 'NO',
websites: [{
    main_title: 'My Blog Website',
    main_url: 'http://www.example.com',
        blog_posts: [{
            url: 'http://www.example.com/01.html',
            title:'My first blog post',
            description: 'My first description.'
        }, { 
            url: 'http://www.example.com/02.html',
            title: 'My second blog post',
            description: 'My second description.'
        }, { 
            url: 'http://www.example.com/03.html',
            title: 'My third blog post',
            description: 'My third description.'
        }, { 
            url: 'http://www.example.com/04.html',
            title: 'My fourth blog post',
            description: 'My fourth description.'
        }]
    }]
}

Hier is wat ik dacht dat zou werken met behulp van update en upsert TRUE maken.

db.my_collection.update ({'websites.blog_posts.url': 'http://www.example.com/01.html'}, {'$ set': {'websites.blog_posts.impressions': 549}}, waar)

The error that I received is: *can't append to array using string field name [blog_posts]*

Misschien is "$ set" hier niet correct voor of kan ik niet diep verwijzen naar puntnotatie? Ik ben gisteren net begonnen met MongoDB, alle hulp zou geweldig zijn.

Dank je!

6

1 antwoord

Wat je probeert te doen, is niet mogelijk gezien je schema. Dot-notatie kan multisiveau zijn, maar als er meer dan één niveau is dat een array is, kan deze niet langer worden geadresseerd met behulp van de positionele operator '$'.

Bijv. je zou moeten doen:

db.my_collection.update( 
    {'websites.blog_posts.url': 'http://www.example.com/01.html' },
    {'$set': {'websites.$.blog_posts.$.impressions': 549}},
     true );

Maar het hebben van twee positie-operators in de update is niet mogelijk omdat MongoDB alleen de positie van een element in de eerste array kan bepalen.

Je enige optie is om je schema opnieuw te ontwerpen om een ​​speciale verzameling gebruikerswebsites te hebben (wat ook in dit geval om andere redenen beter is).

5
toegevoegd
U hebt gelijk, mijn probleem was mijn schema en mijn onjuiste haakjes voor het opslaan van een ingebed document. In plaats daarvan gebruikte ik haakjes voor een array. Ik heb nu met succes nieuwe velden 4 niveaus diep toegevoegd met behulp van puntnotatie met het juiste schema.
toegevoegd de auteur Chris, de bron
Geweldig, veel geluk;)
toegevoegd de auteur Remon van Vliet, de bron