#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 уровня глубиной, используя точечную нотацию с правильной схемой.