То, что я пытаюсь сделать, это добавить новое поле {поле: значение} для сообщения в блоге. Например, если я хотел начать отслеживать показы на сайтах.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, любая помощь будет отличной.
Спасибо!
То, что вы пытаетесь сделать, невозможно, учитывая вашу схему. Dot-нотация может быть многоуровневой, но если имеется более одного уровня, который является массивом, он больше не может быть рассмотрен с помощью оператора позиционирования «$».
Например. вам нужно будет сделать:
db.my_collection.update(
{'websites.blog_posts.url': 'http://www.example.com/01.html' },
{'$set': {'websites.$.blog_posts.$.impressions': 549}},
true );
Но наличие двух операторов положения в обновлении невозможно, поскольку MongoDB может определять положение элемента в первом массиве.
Ваш единственный вариант - перепроектировать вашу схему, чтобы иметь специальную коллекцию пользовательских веб-сайтов (что также лучше по другим причинам тоже в этом случае).