如何在mongoDB中查询以错误日期格式保存为文本的日期

时间:2013-08-15 17:01:22

标签: mongodb mongodb-java

我对mongodb很新 我有一个带有sale_date的数据库,值保存为文本,格式为“dd:mm:yyyy”。现在我想根据日期查询。就像我想查询上个月的条目。 我也有字段sale_time并保存为文本,格式为“hh:mm”,我想查询最后一小时的条目。

**我想从java和mongo控制台查询。

我的一行收藏:

    {  
       "_id":112350,
       "sale_date":"21.07.2011",
       "sale_time":"18:50",
       "store_id":"OK3889-45",
       "region_code":45,
       "product_id":"QKDGLHX5061",
       "product_catagorie":53,
       "no_of_product":1,
       "price":1211.37,
       "total_price":1211.37
    }

我有数百万条款。现在我想查找2011年7月21日或当地时间为18.07.2013的18:00到19:00的条目。

2 个答案:

答案 0 :(得分:2)

您可以使用与结果匹配的正则表达式进行查询。您说格式为dd:mm:yyyy,但示例看起来像dd.mm.yyyy,所以我在示例

中使用了它

例如:

db.sales.find({sale_date: /..\.07\.2011/})

这是无效的,因为它不能使用索引,但它可以完成工作。

如果你坚持使用日期作为字符串来将顺序反转为yyyy:mm:dd,那么你可以使用锚定的正则表达式,这将会达到如下索引:

db.sales.find({sale_date: /2011\.07/})

小时查询:

db.sales.find({sale_date: "21.07.2013", sale_time: {$gte: "18:00", $lt: "19:00"}})

答案 1 :(得分:0)

在给定您使用的日期结构的情况下,没有有效且可靠的方法来查询您想要的日期范围。例如,正则表达式样式查询将扫描整个集合,如果您有数百万个文档,则这是不可接受的。

理论上,您可以创建MapReduce以更好地将数据结构化为新的集合。但是,这将需要更多维护工作(因为MapReduces不会自动更新,并且可能会使其他查询和数据获取涉及比您想要的更多步骤)。

虽然,如果你愿意这样做,我强烈建议你改为按照我在评论中提到的数据来修复你的数据是标准的YYYYMMDD。更好的是,您可能需要考虑合并时间,并将时间戳包含在同一个字段中:

2013-07-21T14:30

如果不这样做,您仍然可以合理地进行单日期查询(尽管您希望将日期和时间都作为复合索引编制索引):

db.sales.ensureIndex({ sale_date: 1, sale_time: 1})

关于代码,它基本上看起来像这样:

BasicDBObject date = new BasicDBObject("sale_date", "21.07.2013");
BasicDBObject time = new BasicDBObject("sale_time", 
                               new BasicDBObject("$gte", "18:00").
                                           append("$lte", "19:00")); 
BasicDBObject andQuery = new BasicDBObject();
List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
obj.add(date);
obj.add(time);
andQuery.put("$and", obj);

cursor = coll.find(andQuery);