如何使用Java驱动程序从MongoDB中存储的数组中检索Integer和Timestamp值

时间:2017-05-06 17:47:50

标签: java arrays mongodb mongo-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数组中输入的值,而不是DBObjectBasicDBObject,但作为Timestamp类中可比较的对象,能够进行其他操作。我该怎么办?

到目前为止,我已经能够从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();
    }

对不起我的英文,谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

基于Java Driver API,您可以从DBObject获取基本Java类型。

您无法直接从DBObject获取Timestamp实例。

BasicDBObject的API文档: http://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/BasicDBObject.html

继承的BasicBSONObject的API文档:http://mongodb.github.io/mongo-java-driver/3.4/javadoc/org/bson/BasicBSONObject.html

还有其他Java MongoDB库。其中之一是MongoJack基于Java驱动程序和Jackson库。它支持开箱即用的JSON到Java对象映射。

答案 1 :(得分:0)

将您的代码更新为以下内容。使用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);