2

我有如下所示的代码。我查询 MongoDB,结果被序列化并返回。但我想为每个记录/文档添加一个新值,在本例中为“年龄”。所以我想我会遍历结果并用 one.put 添加它们,但返回的 json 中没有显示该值。

我究竟做错了什么?

感谢您的任何帮助或建议!

    public String (int id){     
        DBCollection collection = database.getCollection("collection");
        BasicDBObject query = new BasicDBObject();
        query.put("id", id);

        DBCursor cursor = collection.find(query);       
        if (cursor.hasNext()) {
            DBObject one = cursor.next();
            one.put("age", 33);
        }

        String json = JSON.serialize(cursor)

        return json;
    }   
4

3 回答 3

2

如果您只想将属性注入结果而不保存数据库中的更改,我建议您使用以下实现:

public String getJSONString(int id) {     
    DBCollection collection = database.getCollection("collection");
    DBObject query = new BasicDBObject("id", id);

    List<DBObject> objects = collection.find(query).toArray();       
    for (DBObject obj : objects) {
        obj.put("age", 33);
    }

    return JSON.serialize(objects)
}

请注意,如果以这种方式实现,所有对象都必须保存在内存中。

顺便说一句:您不会在原始帖子中循环光标(if而不是while)。此外,游标应始终在 finally 块中关闭。

于 2012-10-31T12:57:02.733 回答
0

这就是我最终通过使用 ArrayList 使其工作的方式:

        public String (int id){     
            DBCollection collection = database.getCollection("collection");
            BasicDBObject query = new BasicDBObject();
            query.put("id", id);

            ArrayList<DBObject> al = new ArrayList<DBObject>();     
            while(cursor.hasNext()){
                DBObject one = cursor.next();        
                one.put("age", 33);
                al.add(one);
            }       

            String json = JSON.serialize(al)

            return json;
        }
于 2012-11-01T07:36:46.347 回答
0

我怀疑游标是否会用新的 put 更新,因为它是针对现有查询的。

编辑:为了添加新值,我会推荐两种解决方案。

  1. 将 JSON 文档映射到 POJO,然后调用适当的 setter。这是一种更清洁且可扩展的方法。
  2. 将值复制到 Map,然后添加最终的 key:value,在本例中为 age:33。

用于保存更新的 obj

你不是save在调用collection.

有关更多信息,请参阅在 Mongo 文档中保存对象,尤其是解释更新的最后一部分。

于 2012-10-31T10:03:53.520 回答