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

问题描述 投票:1回答:2

我是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日或17:00到19:00的小时的条目。

mongodb mongodb-java
2个回答
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"}})

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);
© www.soinside.com 2019 - 2024. All rights reserved.