3

我正在尝试将多个 CSV 导入并合并到 mongo 中,但是文档被替换而不是合并。

例如,如果我有一个.csv:

key1, first column, second column

和两个.csv:

key1, third column

我想结束:

key1, first column, second column, 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
4

4 回答 4

3

跨集合解决方法: forEach 方法可以在虚拟集合上运行,生成的 doc 对象用于搜索/更新所需的集合:

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}})})
于 2014-04-23T07:16:03.660 回答
3

这就是工作方式mongoimport。合并导入有一个现有的新功能请求,但现在,您必须编写自己的导入以提供合并行为。

于 2013-07-01T13:11:21.957 回答
1

That's correct, mongoimport --upsert updates full documents. You may achieve your goal by importing to a temporary collection and using the following Gist.

Load the script to Mongo Shell and run:

mergeCollections("srcCollectionName", "destCollectionName", {}, ["thirdColl"]); 
于 2014-05-27T08:56:54.890 回答
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 转换为 JSON 行jline-csv2jl。这会将每个 CSV 行转换为一个字典,其名称取自标题。

我已将此示例添加到手册中:https ://github.com/bitdivine/jline/blob/master/bin/foreach.md

我没有使用过承诺的 jline,但到目前为止还可以。

免责声明:我是 jline 的作者。

于 2015-10-01T15:37:37.417 回答