2011-07-22 38 views
1

我正在使用perl MongoDBx :: Class,下面的教程将插入下面的文档。 tags字段是散列数组。尝试使用mongodb的$ pull和$ addToSet函数删除标记并添加标记,但未成功。MongoDB - 在散列数组的字段中添加/删除元素如何

如何向/从标签字段添加/删除元素?如果你不是perl程序员,那么在mongodb shell命令中回答也是可以的。

谢谢。

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,overrided官方MongoDB的驱动程序的更新方法,所以$拉的更深层次的探索之后,$ 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字段的方法。

回答

1

我会做这在蒙戈外壳语法,转换为Perl作为需要:

地址:

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

REMOVE分类:

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

谢谢。如果我使用官方的MongoDB,我在数组中使用了$ pull和$ addToSet,但不知道如何在哈希数组中使用。MongoDBx :: Class有更新方法,可以避免根据官方的MongoDB api设置$。经过一个晚上的探索,我想到了另一个愚蠢的解决方案,作为编辑添加到原始文章。 – Weiyan

0

我是MongoDBx :: Class的作者。

当使用MongoDBx ::类,你有两个选择更新文件:使用update()方法的收集对象

常规,MongoDB的方式:

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

这使您可以执行所有MongoDB的改性剂,如$ addToSet,$推,拉$等

的MongoDBx :: W级唉,使用文档对象的update()方法:

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

这是更快,有些更清洁,但只有真正执行$组修改,所以无论你提供的“标签”上例中的属性将成为该属性的新值。

希望这会有所帮助, 伊多。

相关问题