【发布时间】:2012-04-14 05:45:47
【问题描述】:
在mongodb adhoc查询中,在执行查询之前,如何将日期类型元素格式化为dd\mm\yyyy格式再执行查询?
【问题讨论】:
-
嗯,你用的是什么编程语言?您是否以编程方式执行此操作?
标签: mongodb
在mongodb adhoc查询中,在执行查询之前,如何将日期类型元素格式化为dd\mm\yyyy格式再执行查询?
【问题讨论】:
标签: mongodb
不久前我问了一个类似的问题...这可能就是您要找的东西:What is the syntax for Dates in MongoDB running on MongoLab?
【讨论】:
如果您使用 Java,您可以使用 DateFormat 类的 parse 方法从字符串创建 Date 对象。
可以在此处找到有关 DateFormat 类的 Java 文档: http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DateFormat.html
parse 方法的具体部分在这里: http://docs.oracle.com/javase/1.4.2/docs/api/java/text/DateFormat.html#parse%28java.lang.String%29
可以在此处找到有关 Date 对象的 Java 文档: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Date.html 根据“构造函数摘要”部分,将字符串传递给构造函数的能力是“已弃用。从 JDK 版本 1.1 开始,由 DateFormat.parse(String s) 取代。”
在研究上述内容时,我还遇到了 Calendar 类,它可用于转换 Date 对象和一组整数。此应用程序可能没有必要,但我认为包含文档链接可能很有用: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html
可以通过 set 方法传入年、月、日、小时等的整数: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Calendar.html#set%28int,%20int,%20int,%20int,%20int%29
作为示例,这里有一个简短的 Java 程序,它创建许多 Date 对象,将它们存储在 Mongo 集合中,然后执行类似于您所描述的查询。希望它会帮助你实现你的目标。注意:该程序会删除一个名为“dates”的集合,因此如果您的数据库中已有这样的集合,请务必更改集合名称!
public static void main(String[] args) throws UnknownHostException, MongoException {
Mongo m = new Mongo( "localhost:27017" );
DB db = m.getDB("test");
DBCollection coll = db.getCollection("dates");
coll.drop();
DateFormat df = DateFormat.getInstance();
String dateString = new String();
Date myDate = new Date();
// Save some test documents
for(int i=1; i<11; i++){
dateString = "04/" + String.valueOf(i) + "/12 11:00 AM, EST";
BasicDBObject myObj = new BasicDBObject("_id", i);
try {
myDate = df.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
myObj.put("date", myDate);
System.out.println(myDate);
coll.save(myObj);
}
// Build the query
Date startDate = new Date();
Date endDate = new Date();
try {
startDate = df.parse("04/4/12 11:00 AM, EST");
endDate = df.parse("04/6/12 11:00 AM, EST");
} catch (ParseException e) {
e.printStackTrace();
}
BasicDBObject dateQuery = new BasicDBObject();
dateQuery.put("$gte", startDate);
dateQuery.put("$lte", endDate);
System.out.println("---------------");
//Execute the query
DBCursor myCursor = coll.find(new BasicDBObject("date", dateQuery));
//Print the results
while(myCursor.hasNext()){
System.out.println(myCursor.next().toString());
}
}
【讨论】:
我通过使用 java 中的 getTime() 方法将日期时间插入为整数来解决这个问题。 例如:
Date dt=new Date();
long integer_date=dt.getTime();
我使用上面的代码行将日期插入为整数。这样很容易获取特定日期之间的记录。
【讨论】:
Date 类有一个before(date) 或after(date) 方法...易于使用:无需转换为秒/毫秒。
public void execute(Tuple input) {
try {
date=(Date) input.getValueByField("date");
boolean before = date.before(myDate); // compare the data retrieved with your date.
if (before) {
...
} else {
...
}
} catch (Exception e) {
logger.error("Error...", e);
}
这种方法比公认的答案更容易..
【讨论】:
这是使用完整的格式将代码从简单的日期时间格式转换为日期格式,反向步骤也支持这种从 MongoDB 检索日期的方式。
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date fDate = formatter.parse((String) metaData.getValue());
newMeta.setValue(fDate);[![In this image you can see how is the save scenario process in mongoDB][1]][1]
【讨论】: