de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Chris
Chris
Вопрос

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 2011-10-27T13:22:35+00:00 1
 Chris
Chris
Редактировал вопрос 27-го октября 2011 в 1:41
Программирование
mongodb
Remon van Vliet
27-го октября 2011 в 2:29
2011-10-27T14:29:18+00:00
Дополнительно
Источник
Редактировать
#56789239

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

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

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

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

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

5
0
Похожие сообщества 3
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
3 499 пользователей
Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.
Открыть telegram
MongoDB Russian
MongoDB Russian
2 594 пользователей
> db.stats() https://combot.org/chat/-1001035023078
Открыть telegram
dbGeeks
dbGeeks
799 пользователей
Чат про базы данных, их устройство и приемы работы с ними. Разрешаются любые адеватные дискуссии в рамках тематики чата.
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 5 дней назад
2
Hideo Nakagawa
Зарегистрирован 5 дней назад
3
Sergiy Tytarenko
Зарегистрирован 1 неделю назад
4
shoxrux azadov
Зарегистрирован 1 неделю назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией