我是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的小时的条目。
您可以使用与结果匹配的正则表达式进行查询。你说格式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"}})
鉴于您使用的日期结构,没有有效且可靠的方法来查询您想要的日期范围。例如,正则表达式样式查询将扫描整个集合,如果您有数百万个文档,那么这是不可接受的。
理论上,您可以创建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);