如果我理解正确,您需要为第一列中的每个唯一 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 添加另一列,这对您来说可能更容易。)否则,您可以使用光标。 forEach()。
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 字段。现在,开始将这些文档转换为子文档!我们将使用聚合,特别是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:[]}}))
现在我们有了一个集合 new_celldata,其中的数据看起来像我们想要的那样!最后,最后一步是在 MISDIN_mine 上创建索引。
db.new_celldata.ensureIndex({MISDIN_mine: 1});
现在,您可以使用 new_celldata 集合来解决您正在处理的任何问题。:)