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

#mongodb

#mongodb

Вопрос:

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

Моя текущая структура документа:

 { 
email_address: 'webmaster@example.com', 
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.'
        }]
    }]
}
 

Вот то, что, как я думал, будет работать с использованием update и создания upsert TRUE.

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

Ошибка, которую я получил: * невозможно добавить в массив, используя строковое имя поля [blog_posts] *

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

Спасибо!

Ответ №1:

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

Например. вам нужно будет сделать :

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

Но наличие двух операторов позиции в обновлении невозможно, поскольку MongoDB может определять позицию элемента только в первом массиве.

Ваш единственный вариант — перепроектировать вашу схему, чтобы иметь выделенную коллекцию пользовательских веб-сайтов (что в данном случае лучше и по другим причинам).

Комментарии:

1. Вы правы, моя проблема заключалась в моей схеме и неправильных скобках для хранения встроенного документа. Вместо этого я использовал скобки для массива. Теперь я успешно добавил новые поля на 4 уровня глубиной, используя точечную нотацию с правильной схемой.