MongoDB - 在哈希数组的字段中添加/删除元素如何

时间:2011-07-22 10:47:51

标签: perl mongodb

我正在使用perl MongoDBx :: Class,按照我在下面插入文档的教程。 tags字段是一个hash数组。尝试使用mongodb的$ pull和$ addToSet函数删除标记并添加标记,但没有成功。

如何在标签字段中添加/删除元素?如果你不是perl程序员,请在mongodb shell命令中回答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 个答案:

答案 0 :(得分:1)

我将在mongo shell语法中执行此操作,根据需要转换为perl:

ADD:

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}}})

这会回答你的问题吗?

答案 1 :(得分:0)

我是MongoDBx :: Class的作者。

使用MongoDBx :: Class时,您有两个选项来更新文档:

通过在集合对象上使用update()方法的常规MongoDB方式:

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

这允许你执行所有MongoDB的修饰符,例如$ addToSet,$ push,$ pull等。

MongoDBx :: Class方法,在文档对象上使用update()方法:

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

这更快,更干净,但它只是真正执行$ set修饰符,所以无论你提供给上面例子中的“tags”属性,都将是该属性的新值。

希望这有帮助, IDO。