2013-07-01 69 views
3

我想導入併合併成mongo多個CSV文件,但文件正在被替換,而不是合併。Mongoimport合併/ upsert字段

舉例來說,如果我有one.csv:

key1, first column, second column 

和two.csv:

key1, first column, second column, third column 

但是相反:

key1, third column 

我想直到結束我得到:

key1,third column 

目前我使用:

mongoimport.exe --ftype csv --file first.csv --fields key,firstColumn,secondColumn 
mongoimport.exe --ftype csv --file second.csv --fields key,thirdColumn --upsert --upsertFields key1 
+0

Mongoimport不支持這個(請參閱下面的johnnyhk)。 (){「keyfield」:「key」},{「$ set」:{「field」:「data」}}) – chris

回答

3

就是這樣mongoimport作品。對於合併導入,現有new feature request,但現在,您必須編寫自己的導入來提供合併行爲。

3

交叉採集解決方法:方法的forEach可以在一個虛擬的收集上運行並用於搜索/更新所需收集得到的文檔對象:

mongoimport.exe --collection mycoll --ftype csv --file first.csv --fields key,firstColumn,secondColumn 
mongoimport.exe --collection dummy --ftype csv --file second.csv --fields key,third 

db.dummy.find().forEach(function(doc) {db.mycoll.update({key:doc.key},{$set:{thirdcol:doc.third}})}) 
1

這是正確的,mongoimport --upsert更新整個文檔。 您可以通過導入臨時收藏並使用以下Gist來實現目標。

負載腳本蒙戈殼牌和運行:

mergeCollections("srcCollectionName", "destCollectionName", {}, ["thirdColl"]); 
+1

偉大的解決方案(Y) – Azzurrio

0

我只是有一個非常類似的問題。 mongo有一個節點模塊,jline是我的命令行節點工具,用於流處理JSON行。所以:

echo '{"page":"index.html","hour":"2015-09-18T21:00:00Z","visitors":1001}' |\ 
jline-foreach \ 
    'beg::dp=require("bluebird").promisifyAll(require("mongodb").MongoClient).connectAsync("mongodb://localhost:27017/nginx")' \ 
    'dp.then(function(db){ 
     updates = {} 
     updates["visitors.hour."+record.hour] = record.visitors; 
     db.collection("pagestats").update({_id:record.page},{$set:updates},{upsert:true});});' \ 
    'end::dp.then(function(db){db.close()})' 

你的情況,你不得不從CSV首先通過jline-csv2jl管道將其轉換成JSON線。這將每個CSV行轉換成一個名稱取自標題的字典。

我加入這個例子手冊:https://github.com/bitdivine/jline/blob/master/bin/foreach.md

我沒有用的JLine與承諾很多,但到目前爲止,它的確定。

聲明:我是jline的作者。