这是我的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或 对我的误解?
谢谢!
答案 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));