2012-10-31 45 views
2

我有如下所示的代码。我查询了MongoDB,结果被序列化并返回。但是我想为每个记录/文件增加一个新的值,在这个例子中是'age'。 所以我想我会循环的结果,并添加one.put,但价值不显示在返回的JSON。MongoDB&Java,为结果添加一个值

我在做什么错?

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

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; 
    } 
+0

返回的JSON被用于输出。在这个输出中,我需要添加一个值,它不必保存在数据库中。 –

+1

您正在“if”中创建一个新的DBObject,然后您不在任何地方保存它。新字段只存在于“one” - 一个只包含“if”语句范围内的对象。顺便说一句,你没有任何地方的循环 - 我建议你循环游标追加每个记录* *新的字段添加到一个新的列表,然后输出该列表(序列化)。 –

+0

对不起,我不完全明白。你有代码示例吗? –

回答

0

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

编辑: 为了增加一个新值,我会推荐两个解决方案。

  1. 将JSON文档映射到POJO,然后调用相应的setter。这是一种更清洁和可扩展的方法。
  2. 将这些值复制到一个Map中,然后添加最终的键值:在这种情况下,该值为age:33。

用于保存更新的OBJ

你是不是呼吁collectionsave

有关更多信息,请参阅Saving objects,特别是解释更新的最后一部分。

+0

嗨,返回的json被用于输出。在这个输出中,我需要添加一个值,它不必保存在数据库中。 –

+0

@StevenFilipowicz添加了更新。 –

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块中应始终为closed

+0

谢谢!我没有尝试这个,但它看起来应该工作。用if/while打错。感谢您的评论关闭光标。 –

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; 
     }