1

我对 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 月或 2013 年 7 月 21 日 18:00 到 19:00 小时的条目。

4

2 回答 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"}})
于 2013-08-15T17:36:23.603 回答
0

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

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

虽然,如果您愿意这样做,我强烈建议您改用我在评论中提到的将您的数据修复为标准的 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);
于 2013-08-15T17:57:39.167 回答