如何在Mongodb中添加/更新动态计数器?

时间:2011-12-14 11:00:13

标签: mongodb counter upsert

这是我的CSV文件:

12;France;http://www.google.com
12;France;http://www.google.com

对于每一行,我使用$ field []结构来填充我的Mongo 对象如下所示:

array(18) {
  ["date_day"]=>  int(12)
  ["url"]=>  string(21) "http://www.google.com"
  ["country"]=>  string(6) "France"
}

对于这两行中的每一行,我都会调用以下内容:

$result = $coll->update ( array ( 'ts_day' => $field['date_day'] ,'url'=>$field['url']),array('$addToSet' => array ( "countries" => array ( 'name' =>$field['country'] )) ),array ('upsert' => true ));

$result = $coll->update ( array ( 'ts_day' => $field['date_day'] ,'url' => $field['url'] , 'countries.name' => $field['country'] ),array ( '$inc' => array( 'countries.$.views'=> 1) ) ,array ( 'upsert' => true));

我不明白为什么我得到一个额外的{“name”:“France”}对象 “国家”阵列,没有“意见”计数器,虽然是柜台 在countries.france.views中正确递增(其值为2, 这是正确的):

{ "_id" : ObjectId("4eeb0e6cd86450af72f775be"), "url" : "http://www.google.com", "countries" : [ { "name" : "France", "views": 2 }, { "name" : "France" } ], "ts_day" : 12 }

对于这个孤独{{name“:”France“}的任何想法? Mongo bug或 对我的误解?

谢谢!

3 个答案:

答案 0 :(得分:1)

听起来你太习惯使用标准的mongoimport / export工具处理你的CSV文件了。

如果查看源代码,您会发现这两个工具是使用MongoDB C ++驱动程序的相当简单的客户端应用程序。如果用Python或Ruby编写,他们只想要5到10行。

为什么不简单地编写一个新的脚本来读取CSV文件并按照您希望的方式插入文档?想做聚合?在客户端代码中执行!想要完全控制架构吗?你定了!

事实上,这将是最好的前进方式 - 提供mongoimport / export是为了方便而不是全面。如果您的数据提取过程需要在已经写入数据库后大量更新大量文档,您甚至可能会开始看到压缩和性能方面的问题。

答案 1 :(得分:0)

您需要使用$ inc运算符。如果目标字段与您指定的条件匹配,则会增加目标字段。

http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

答案 2 :(得分:0)

这就是诀窍:

$ result = $ coll-> update(数组(' ts_year' => $ field [' date_year'],' ts_month' => $ field [' date_month'],' ts_day' => $ field [' date_day'],' asset' => $ field [' url']), 数组(' $ inc' =>数组("国家/地区。"。$ field [' country']。" .views" = > 1)),数组(' upsert' => true));