mongodb当日期保存为字符串时查询日期范围

时间:2014-02-21 11:39:39

标签: mongodb date

我将数据保存为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亿左右。

1 个答案:

答案 0 :(得分:3)

最后一次尝试,因为你没有接受好建议的良好记录。

您的日期格式是 来咬你。即使在试图解决它们的地方。以下是问题:

  • 格式不是词汇。这意味着即使使用字符串比较运算符(如$gte),$lte也无法正常工作。 词汇日期将是“yyyy-mm-dd”格式的“2012-01-04”。这适用于运营商。

  • 您可以在$substr内查看aggregate(并且完整缺乏文档,在SO上搜索实际用途),但您的日期格式缺少daymonth的双位数形式,即“04/01/2012”,这样就会破坏运营商的位置性质。你也 在任何$match之前进行转换,这意味着你炸毁任何减少管道输入的机会,所以你是坚持能够按date过滤大型结果集

这是一个可怕的案例,但这里的大数据问题确实没有其他实际解决方案,而不是转换您的日期。你刚刚没有削减它的形式的字符串。或者,按优先顺序转换为:

  • BSON日期
  • 纪元时间戳一样长(无论如何)
  • 词汇表字符串表示(如描述)

您的主要案例似乎是过滤,因此更新数据集是唯一的实用选择。否则,你会遇到“分页”结果并执行很多的手动工作,否则可以在服务器端完成。