2011-12-14 122 views
0

这里是我的CSV文件:如何在Mongodb中添加/更新动态计数器?

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

对于每一行,在$场[]结构我用它来填充我蒙戈 对象如下所示:

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

我不明白为什么我得到一个额外{“名”:“法国”}对象 的“国家”阵列,没有“意见”柜台,但柜台 在countries.france.views适当增加(其值是2, 这是正确的):

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

任何想法,这寂寞{“名字”:“法国”}? Mongo bug还是 误解我的?

谢谢!

回答

1

这听起来像你上了挂在使用标准mongoimport /导出工具来处理您的CSV文件。

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

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

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

+0

嗨布兰登。不是那么多(我打算实际上是手动提取CSV文件)。我的关注是能够请求1TB数据托管单个节点,以提供实时分析。因此聚合。做客户端或通过m/r将太昂贵/太长,我猜。 – SCO 2011-12-15 14:44:05

0

这是卓有成效:

$结果= $ coll->更新(阵列( 'ts_year'=> $字段[ 'date_year'], 'ts_month'=> $字段[ 'date_month'], ''ts_day'=> $ field ['date_day'],'asset'=> $ field ['url']), array('$ inc'=> array(“countries。”。$ field ['country']] “。views”=> 1)),array('upsert'=> true));