我将数据保存为bongo作为批量插入。作为JSON对象数组的数据包含日期,数字,字母数字数据,全部保存为字符串。
示例数据
[{
"CARDNO": "661",
"HOLDERNO": "661",
"HOLDERNAME": "S",
"IODATE": "4/1/2012",
"IOTIME": "00:03:27",
"IOGATENO": "01-3",
"IOGATENAME": "FWork",
"IOSTATUS": "Entry",
"DEPARTMENTNO": "1",
"UPDATE_STATUS": "1"
}, {
"CARDNO": "711",
"HOLDERNO": "711",
"HOLDERNAME": "P",
"IODATE": "4/1/2012",
"IOTIME": "04:35:33",
"IOGATENO": "01-7",
"IOGATENAME": "FDWork",
"IOSTATUS": "Exit",
"DEPARTMENTNO": "3",
"UPDATE_STATUS": "1"
}]
我的查询
var start = new Date(2012,4,15); var end = new Date(2012,4,1);
collection.find({
"IODATE": {
$gte: start,
$lt: end
}
}).toArray(function (err, data) {
if (err) {
console.log(err);
} else {
console.log(data.length)
}
//res.send(data.length);
res.send(JSON.stringify(data));
});
它没有返回结果,我认为这是因为"IODATE"
的值在db中的字符串中。
如何解决此问题?我可能需要进行批量插入,因为数据可能是2亿左右。
答案 0 :(得分:3)
最后一次尝试,因为你没有接受好建议的良好记录。
您的日期格式是 来咬你。即使在试图解决它们的地方。以下是问题:
格式不是词汇。这意味着即使使用字符串比较运算符(如$gte),$lte也无法正常工作。 词汇日期将是“yyyy-mm-dd”格式的“2012-01-04”。这适用于运营商。
您可以在$substr内查看aggregate(并且完整缺乏文档,在SO上搜索实际用途),但您的日期格式缺少day
和month
的双位数形式,即“04/01/2012”,这样就会破坏运营商的位置性质。你也 在任何$match之前进行转换,这意味着你炸毁任何减少管道输入的机会,所以你是坚持不能够按date
过滤大型结果集。
这是一个可怕的案例,但这里的大数据问题确实没有其他实际解决方案,而不是转换您的日期。你刚刚没有削减它的形式的字符串。或者,按优先顺序转换为:
您的主要案例似乎是过滤,因此更新数据集是唯一的实用选择。否则,你会遇到“分页”结果并执行很多的手动工作,否则可以在服务器端完成。