MongoDB, додайте нову {поле: значення} в існуючий вбудований документ з кількома точками позначення рівнів?

Я намагаюся додати нову {поле: значення} для публікації в блозі. Так, наприклад, якщо я хочу почати відстежувати покази на веб-сайтах.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.'
        }]
    }]
}

Ось що я думав би працювати, використовуючи оновлення і зробивши поправку ІСТИНА.

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

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

Може бути, "$ set" є неправильним для цього, або, можливо, я не можу вказати це глибоко з точковими позначеннями? Я тільки що почав використовувати MongoDB вчора, будь-яка допомога буде чудовою.

Дякую!

6

1 Відповіді

Те, що ви намагаєтеся зробити, неможливо, враховуючи схему. Точка-позначення може бути багатоступеневим, але якщо існує більше одного рівня, тобто масиву, його більше не можна вирішувати за допомогою позиційного оператора "$".

Наприклад, вам потрібно зробити:

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, джерело