MongoDB - добавить / удалить элементы в поле массива хэша, как - PullRequest
1 голос
/ 22 июля 2011

Я использую perl MongoDBx :: Class, следуя инструкции, которую я вставил в документ ниже. Поле тегов представляет собой массив хэшей. Попытка удалить тег и добавить тег с помощью функции $ pull и $ addToSet mongodb безуспешно.

Как добавить / удалить элементы в поле тегов? Если вы не программист на Perl, ответьте в команде оболочки mongodb также wlcome.

Спасибо.

my $novel = $novels_coll->insert({
   _class => 'Novel',
   title => 'The Valley of Fear',
   year => 1914,
   author => {
      first_name => 'Arthur',
      middle_name => 'Conan',
      last_name => 'Doyle',
   },
   added => DateTime->now(time_zone => 'Asia/Jerusalem'),
   tags => [
      { category => 'mystery', subcategory => 'thriller' },
      { category => 'mystery', subcategory => 'detective' },
      { category => 'crime', subcategory => 'fiction' },
   ],
});

Это документ вставлен:

{
    "_id": {
        "$oid": "4e27eae3008a6ee40f000000"
    },
    "_class": "Novel",
    "added": "2011-07-21T12:01:23+03:00",
    "author": {
        "middle_name": "Conan",
        "last_name": "Doyle",
        "first_name": "Arthur"
    },
    "tags": [
        {
            "subcategory": "thriller",
            "category": "mystery"
        },
        {
            "subcategory": "detective",
            "category": "mystery"
        },
        {
            "subcategory": "fiction",
            "category": "crime"
        }
    ],
    "title": "The Valley of Fear",
    "year": 1914
}

Редактировать:

После более глубокого изучения MongoDBX метод обновления переопределил официальный драйвер MongoDB, поэтому $ pull, $ addToSet может не работать. Я буду использовать этот глупый метод:

my $novel = $novel_coll->find_one({ some criteria });
my @tags = $novel->tags;
my @updated_tags = grep(unless($tag{category=>CATEGORY}, @tags);  #to pull out unwanted tag. Or use push to add new tag.
$novel->update({tags=>\@updated_tags});

Надеюсь, у MongoDBx есть метод для обновления поля arrayRef.

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Я сделаю это в синтаксисе оболочки монго, при необходимости преобразую в perl:

ДОБАВИТЬ:

db.novels_coll.update({_id: ID, ...other criteria...}, {$addToSet:{tags:{subcategory:SUBCATEGORY, category:CATEGORY}}})

УДАЛИТЬ ПО КАТЕГОРИИ:

db.novels_coll.update({_id: ID, ...other criteria...}, {$pull:{tags:{category:CATEGORY}}})

УДАЛИТЬ ПО КАТЕГОРИИ И ПОДКАТЕГОРИИ:

db.novels_coll.update({_id: ID, ...other criteria...}, {$pull:{tags:{category:CATEGORY, subCategory: SUBCATEGORY}}})

Это отвечает на ваш вопрос?

0 голосов
/ 02 августа 2011

Я являюсь автором MongoDBx :: Class.

При использовании MongoDBx :: Class у вас есть два варианта обновления документа:

Обычный способ MongoDB,используя метод update () для объекта collection :

$collection->update({ _id => $document->_id }, { '$addToSet' => { tags => { category => 'drama', subcategory => 'chick-flick' } } });

Это позволяет вам выполнять все модификаторы MongoDB, такие как $ addToSet, $ push, $ pull,и т. д.

Способ MongoDBx :: Class с помощью метода update () для объекта document :

$document->update({ tags => \@new_tags });

Этобыстрее и несколько чище, но на самом деле он выполняет только модификатор $ set, поэтому все, что вы предоставляете атрибуту "tags" в приведенном выше примере, будет новым значением этого атрибута.

Надеюсь, это поможет, Ido.

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