我正在尝试将数据从csv文件导入到mongodb
具有以下数据的CSV文件
7259555112 774561213 3 4
7259555112 774561214 4 5
7259555112 774561215 1 3
7259555112 774561216 2 1
7259555112 774561217 4 2
7259555112 774561218 6 1
7975795117 7599702622 3 2
7975795117 7599702623 2 1
其中第一个数字是MISDIN(cell_number), secod Number是MISDIN 第三个领域是MISDIN从第二个开始获得的第一个领域 第四个fiels是从第一个到第二个的多少支出
我想将此导入mongodb,我需要收藏 架构如下:
7259555112(first_doucment我想把第一个Misdin作为索引)
{
{MSISDN:774561213
INCOMING_COUNT:4
outgoing_count:3
TOTAL_COUNT:7
is_EE:1
},
{MSISDN:774561214
INCOMING_COUNT:3
outgoing_count:2
TOTAL_COUNT:5
is_EE:1
},
{MSISDN:774561215
INCOMING_COUNT:1
outgoing_count:2
TOTAL_COUNT:3
is_EE:0
}
}
7975795117(第二份文件)
{
{MSISDN:7599702622
INCOMING_COUNT:3
outgoing_count:2
TOTAL_COUNT:5
is_EE:1
},
{MSISDN:7599702623
INCOMING_COUNT:2
outgoing_count:1
TOTAL_COUNT:3
is_EE:1
},
请使用mongoimport或任何其他工具指导如何实现此目的
谢谢
答案 0 :(得分:6)
如果我理解正确,您需要第一列中每个唯一MISDIN的文档,每个文档都有第二列中每个MISDIN的子文档,第一个MISDIN具有传入/传出呼叫。因此,对于您提供的数据,集合中的文档如下所示:
{ _id: ObjectId("5237258211f41a0c647c47b1"),
MISDIN_mine: 7259555112,
call_records: [
{ MISDIN_theirs: 774561213,
incoming_count: 3,
outgoing_count: 4,
total_count: 7,
is_EE: 1
},
{ MISDIN_theirs: 774561214,
incoming_count: 4,
outgoing_count: 5,
total_count: 9,
is_EE: 1
}
... ]
}
不可否认,我不确定is_EE
应该代表什么,但让我们完成剩下的工作。
为了以您想要的格式导入数据,首先在CSV文件中添加一个标题(顶部的一行),如下所示:
MISDIN_mine,MISDIN_theirs,incoming_count,outgoing_count
7259555112,774561213,3,4
7259555112,774561214,4,5
...
按照以下方式运行mongoimport:
mongoimport --db yourdb --collection celldata --type csv --file path/to/file.csv --headerline
现在,如果您查看celldata集合,您会注意到文档实际上是这样的:
{ _id: ObjectId("5237258211f41a0c647c47b1"),
MISDIN_mine: 7259555112,
MISDIN_theirs: 774561213,
incoming_count: 3,
outgoing_count: 4
}
下一步是将总计数字段添加到子文档。 (但是,老实说,如果你可以在Excel或类似的程序中弹出你的csv文件并在那里进行计算,为total_count添加另一列,这对你来说可能更容易。)否则,你可以使用{{ 3}}
db.celldata.find().forEach(function(myDoc) { db.cell.update({_id:myDoc._id},{$set:{"total_count":myDoc.incoming_count+myDoc.outgoing_count}})});
现在,您的文档应如下所示:
{ _id: ObjectId("5237258211f41a0c647c47b1"),
MISDIN_mine: 7259555112,
MISDIN_theirs: 774561213,
incoming_count: 3,
outgoing_count: 4,
total_count: 7
}
您现在可以添加is_EE字段。现在,将这些文档转换为子文档!我们将使用聚合,特别是cursor.forEach()到
var reduce = function(curr, result) {
result.call_records.push(
{
MISDIN_theirs: curr.MISDIN_theirs,
incoming_count: curr.incoming_count,
outgoing_count: curr.outgoing_count,
total_count: curr.total_count,
is_EE: curr.is_EE
});
};
db.new_celldata.insert(db.celldata.group({key: {"MISDIN_mine": 1}, reduce: reduce, initial: {call_records:[]}}))
现在我们有一个集合new_celldata,数据看起来就像我们想要的那样!最后,最后一步是在MISDIN_mine上创建索引。
db.new_celldata.ensureIndex({MISDIN_mine: 1});
现在,您可以使用new_celldata集合来解决您正在处理的任何问题。 :)