MongoDB, дадаць новае {поля: значэнне} ў існуючым укаранёны дакумент з пазначэннямі шматузроўневых кропак?

Тое, што я спрабую зрабіць, гэта дадаць новае поле {: значэнне} для блога. Так, напрыклад, калі б я хацеў, каб пачаць адсочваць ўражанні на websites.blog_posts.url: «http://www.example.com/01.html», як я магу дадаць, што атрыбут ўражанні для гэтага паведамленні ў блогу?

Мая бягучая структура дакумента:

{ 
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.'
        }]
    }]
}

Вось тое, што я думаў, што будзе працаваць з дапамогай абнаўлення і зрабіць upsert TRUE.

<�Р> db.my_collection.update ({ 'websites.blog_posts.url': 'http://www.example.com/01.html'}, { '$' набор: { 'websites.blog_posts.impressions': 549}}, дакладна)

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

Можа быць, «$ камплект» не з'яўляецца правільным для гэтага ці, можа быць, я не магу спасылацца, што глыбока з кропкавай натацыі? Я толькі пачаў выкарыстоўваць MongoDB ўчора, любая дапамога будзе вялікім.

Дзякуй!

6

1 адказы

Тое, што вы спрабуеце зрабіць, гэта не магчыма, улічваючы, ваша схема. Dot-натацыя можа быць шматузроўневай, але калі ёсць больш чым адзін узровень, які з'яўляецца масівам ён больш не можа разглядацца з дапамогай пазіцыйнага аператара «$».

напрыклад вам трэба зрабіць:

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

Але наяўнасць двух аператараў пазіцыі ў абнаўленні не ўяўляецца магчымым, так як MongoDB можа толькі вызначыць пазіцыю элемента ў першым масіве.

Адзіным варыянтам з'яўляецца перапраектоўваць схему, каб мець адмысловую калекцыю карыстацкіх вэб-сайтаў (што лепш па іншых прычынах таксама ў дадзеным выпадку).

5
дададзена
Вы правільна, мая праблема была мая схема і мае няправільныя дужкі для захоўвання ўкаранёнага дакумента. Замест гэтага я выкарыстаў дужкі для масіва. Я цяпер паспяхова дададзены новыя поля 4 узроўняў глыбока, выкарыстоўваючы кропкавую натацыю з адпаведнай схемай.
дададзена аўтар Chris, крыніца
Высокі, поспехі;)
дададзена аўтар Remon van Vliet, крыніца