将.csv文件导入mongodb

use*_*203 0 bigdata mongodb nosql mongoimport

我正在尝试将数据从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),第二个数字是MISDIN第三个字段是mnay第一次从第二个第四个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或任何其他工具指导如何实现此目的

谢谢

Ama*_*lia 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
  } 
  ... ]
}
Run Code Online (Sandbox Code Playgroud)

不可否认,我不确定is_EE应该代表什么,但让我们完成其余的工作.

为了以您想要的格式导入数据,首先在CSV文件中添加一个标题(顶部的一行),如下所示:

MISDIN_mine,MISDIN_theirs,incoming_count,outgoing_count
7259555112,774561213,3,4
7259555112,774561214,4,5
...
Run Code Online (Sandbox Code Playgroud)

并按如下方式运行mongoimport:

mongoimport --db yourdb --collection celldata --type csv --file path/to/file.csv --headerline
Run Code Online (Sandbox Code Playgroud)

现在,如果您查看celldata集合,您会注意到文档实际上如下所示:

{ _id: ObjectId("5237258211f41a0c647c47b1"),
  MISDIN_mine: 7259555112,
  MISDIN_theirs: 774561213,
  incoming_count: 3,
  outgoing_count: 4
}
Run Code Online (Sandbox Code Playgroud)

下一步是将总计数字段添加到子文档.(但是,老实说,如果您只是在Excel或类似程序中弹出csv文件并在那里进行计算,为total_count添加另一列,这对您来说可能更容易.)否则,您可以使用光标. forEach().

db.celldata.find().forEach(function(myDoc) { db.cell.update({_id:myDoc._id},{$set:{"total_count":myDoc.incoming_count+myDoc.outgoing_count}})});
Run Code Online (Sandbox Code Playgroud)

现在,您的文档应如下所示:

{ _id: ObjectId("5237258211f41a0c647c47b1"),
  MISDIN_mine: 7259555112,
  MISDIN_theirs: 774561213,
  incoming_count: 3,
  outgoing_count: 4,
  total_count: 7
}
Run Code Online (Sandbox Code Playgroud)

您现在可以添加is_EE字段.现在,将这些文档转换为子文档!我们将使用聚合,特别是group命令来实现

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:[]}}))
Run Code Online (Sandbox Code Playgroud)

现在我们有一个集合new_celldata,数据看起来就像我们想要的那样!最后,最后一步是在MISDIN_mine上创建索引.

db.new_celldata.ensureIndex({MISDIN_mine: 1});
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用new_celldata集合来解决您正在处理的任何问题.:)