MongoDB, добавить новое {field: value} в существующий встроенный документ с многоточечной нотацией? - PullRequest
6 голосов
/ 27 октября 2011

Я пытаюсь добавить новое {field: value} для сообщения в блоге.Например, если я хотел начать отслеживать показы на веб-сайтах website.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.'
        }]
    }]
}

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

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

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

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

Спасибо!

1 Ответ

5 голосов
/ 27 октября 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...