从mongodb对象 - Java驱动程序返回属性

时间:2015-02-23 19:56:39

标签: java mongodb

我有像

这样的mongo对象
{
        "name" : "mongo",
        "values" : [
            {
                    "date" : "02-23-2015",
                    "price" : "5"
            },
            {
                    "date" : "02-23-15",
                    "price" : "6"
            },
            {
                    "date" : "02-22-15",
                    "price" : "7"
            }
    ]
}

我正在使用Java驱动程序,我可以使用以下查询提取此对象:

QueryBuilder builder = new QueryBuilder();
DBObject nameQuery = new BasicDBObject("name", "mongo");
builder.and(nameQuery);
DBObject fullQuery = builder.get();

然而,我想要的是提取所有的价格值,我想将它们存储在一个数组中 - 现在我只能返回整个对象..通过这样的子集在文档中没有很好地解释,一个例子会有所帮助。

任何帮助都将不胜感激。

编辑:好了,我现在可以遍历这个数组中的对象,但它没有利用mongo内置的ins,自然会慢一点:

while (curs.hasNext())
    {
        DBObject o = curs.next();
        BasicDBList values = (BasicDBList) o.get("values");
        BasicDBObject[] valuesArray = values.toArray(new BasicDBObject[0]);
        for(BasicDBObject dbObj : valuesArray) {
            name = dbObj.getString("name");
         }
    }

这允许我提取我想要的任何内容,但我知道有更有效的方法。任何帮助都会很棒,谢谢

2 个答案:

答案 0 :(得分:0)

我认为它应该有用,或者它可以让你接近解决方案:

    DB db = this.getConnection();
    DBCollection coll = db.getCollection(collection);
    BasicDBObject searchQuery = new BasicDBObject();
    searchQuery.put("name", "mongo");

    cursor = coll.find(searchQuery);

    DBObject resultElement = null;
    List <String> prices = new ArrayList<String>(); 

    while(cursor.hasNext()){
            resultElement = cursor.next();
            prices.add ((String) resultElement.get("values.price"));
    }

希望它有所帮助。

答案 1 :(得分:0)

DBCollection.find()方法采用第二个名为keys的参数,它允许您定义应在结果中包含哪些字段。像这样使用它:

collection.find(query, new DBObject("values.price":1);

这将返回一个文档,其值数组仅包含如下价格:

{
    "values" : [
        {
                "price" : "5"
        },
        {
                "price" : "6"
        },
        {
                "price" : "7"
        }
]
}
相关问题