2011-12-14 120 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));