如何使用 Java 驱动程序从存储在 MongoDB 中的数组中检索整数和时间戳值
How to retrive Integer and Timestamp value from array stored in MongoDB with Java Driver
我在 Java 中编写了一个程序,该程序生成值并将它们以以下形式存储在 MongoDB
数据库中:
{
"_id" : 0,
"destination" : "destination_1",
"origin" : "origin1",
"duration_value" : [
5,
5,
12
],
"duration_text" : [
null,
null,
null
],
"timestamp" : [
ISODate("2017-05-03T15:17:12.570Z"),
ISODate("2017-05-03T15:17:39.363Z"),
ISODate("2017-05-06T17:16:43.925Z")
]}
如您所见,共有三个数组。在 duration_value
数组中,它们将始终存储在整数值中,而在 timestamp
数组中,它们将始终存储 time stamp
值。
我现在需要检索存储在 duration_value
中的整数值,以便进行计算并检索在 timestamp
数组中输入的值,而不是 DBObject
或 BasicDBObject
,但是作为Timestamp
中的对象,class即具有可比性,能够进行其他操作。我该怎么办?
到目前为止,我已经能够像 DBObject
一样从数据库中检索元素,而不是使用它们的原始类型,我什至无法毫无错误地转换 DBObject
错误。我使用了以下代码:
MongoClient mongo = null;
DBCursor cursor = null;
try {
mongo = new MongoClient ("localhost", 27017);
DB db = mongo.getDB("testdb2");
DBCollection table = db.getCollection("user");
BasicDBObject searchQuery = new BasicDBObject();
searchQuery.put("_id", 0);
cursor = table.find(searchQuery);
DBObject resultElement = cursor.next();
List<DBObject> list = (List<DBObject>)resultElement.get("timestamp");
for(int i = 0; i < list.size(); i++){
System.out.println("indice: " + i + " contenuto: " + list.get(i));
}
}
catch(Exception e){
System.out.println("error : " + e.getMessage());
System.out.println("error : " + e.getCause());
}
finally{
cursor.close();
}
对不起我的英语,谢谢你的帮助。
基于 Java 驱动程序 API 您可以从 DBObject 获得基本 Java 类型。
您不能直接从 DBObject 获取 Timestamp 实例。
API BasicDBObject 文档:
http://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/BasicDBObject.html
API 继承 BasicBSONObject 的文档:http://mongodb.github.io/mongo-java-driver/3.4/javadoc/org/bson/BasicBSONObject.html
还有其他可用的 Java MongoDB 库。其中之一是 MongoJack,它基于带有 Jackson 库的 Java 驱动程序。它支持开箱即用的 JSON 到 Java 对象映射。
将您的代码更新为以下内容。使用 findOne
而不是 find
搜索 id
。
MongoDB 将时间戳映射到 java.util.Date
,将数字映射到 java.lang.Double
。
DBObject result = table.findOne(searchQuery);
BasicDBList number = (BasicDBList)result.get("duration_value");
BasicDBList timestamp = (BasicDBList)result.get("timestamp");
int integer = ((Number)number.get(i)).intValue();
Date date = (Date) timestamp.get(i);
我在 Java 中编写了一个程序,该程序生成值并将它们以以下形式存储在 MongoDB
数据库中:
{
"_id" : 0,
"destination" : "destination_1",
"origin" : "origin1",
"duration_value" : [
5,
5,
12
],
"duration_text" : [
null,
null,
null
],
"timestamp" : [
ISODate("2017-05-03T15:17:12.570Z"),
ISODate("2017-05-03T15:17:39.363Z"),
ISODate("2017-05-06T17:16:43.925Z")
]}
如您所见,共有三个数组。在 duration_value
数组中,它们将始终存储在整数值中,而在 timestamp
数组中,它们将始终存储 time stamp
值。
我现在需要检索存储在 duration_value
中的整数值,以便进行计算并检索在 timestamp
数组中输入的值,而不是 DBObject
或 BasicDBObject
,但是作为Timestamp
中的对象,class即具有可比性,能够进行其他操作。我该怎么办?
到目前为止,我已经能够像 DBObject
一样从数据库中检索元素,而不是使用它们的原始类型,我什至无法毫无错误地转换 DBObject
错误。我使用了以下代码:
MongoClient mongo = null;
DBCursor cursor = null;
try {
mongo = new MongoClient ("localhost", 27017);
DB db = mongo.getDB("testdb2");
DBCollection table = db.getCollection("user");
BasicDBObject searchQuery = new BasicDBObject();
searchQuery.put("_id", 0);
cursor = table.find(searchQuery);
DBObject resultElement = cursor.next();
List<DBObject> list = (List<DBObject>)resultElement.get("timestamp");
for(int i = 0; i < list.size(); i++){
System.out.println("indice: " + i + " contenuto: " + list.get(i));
}
}
catch(Exception e){
System.out.println("error : " + e.getMessage());
System.out.println("error : " + e.getCause());
}
finally{
cursor.close();
}
对不起我的英语,谢谢你的帮助。
基于 Java 驱动程序 API 您可以从 DBObject 获得基本 Java 类型。
您不能直接从 DBObject 获取 Timestamp 实例。
API BasicDBObject 文档: http://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/BasicDBObject.html
API 继承 BasicBSONObject 的文档:http://mongodb.github.io/mongo-java-driver/3.4/javadoc/org/bson/BasicBSONObject.html
还有其他可用的 Java MongoDB 库。其中之一是 MongoJack,它基于带有 Jackson 库的 Java 驱动程序。它支持开箱即用的 JSON 到 Java 对象映射。
将您的代码更新为以下内容。使用 findOne
而不是 find
搜索 id
。
MongoDB 将时间戳映射到 java.util.Date
,将数字映射到 java.lang.Double
。
DBObject result = table.findOne(searchQuery);
BasicDBList number = (BasicDBList)result.get("duration_value");
BasicDBList timestamp = (BasicDBList)result.get("timestamp");
int integer = ((Number)number.get(i)).intValue();
Date date = (Date) timestamp.get(i);