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

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

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 ответы

То, что вы пытаетесь сделать, невозможно, учитывая вашу схему. 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, источник
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MongoDB Russian
MongoDB Russian
1 086 участник(ов)

> db.stats() https://combot.org/chat/-1001035023078