【问题标题】:How to return raw JSON directly from a mongodb query in Java?如何直接从 Java 中的 mongodb 查询返回原始 JSON?
【发布时间】:2013-08-20 16:50:39
【问题描述】:

我有以下代码:

@RequestMapping(value = "/envinfo", method = RequestMethod.GET)
@ResponseBody
public Map getEnvInfo()
{
    BasicQuery basicQuery = new BasicQuery("{_id:'51a29f6413dc992c24e0283e'}", "{'envinfo':1, '_id': false }");
    Map envinfo= mongoTemplate.findOne(basicQuery, Map.class, "jvmInfo");
    return envinfo;
}

如你所见,代码:

  1. 从 MongoDB 检索 JSON
  2. 将其转换为Map 对象
  3. Map 对象随后由 Spring MongoData 转换为 JSON,然后返回给浏览器。

是否可以直接从MongoDb返回原始json而不经过中间转换步骤?

【问题讨论】:

    标签: java spring mongodb spring-data spring-data-mongodb


    【解决方案1】:

    对我来说,以下工作完美:

    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.query.Query;
    import org.bson.Document;
    
    List<Document> documents = mongoTemplate.find(query, Document.class, "collection_name");
    

    【讨论】:

      【解决方案2】:

      正如 Oliver 指出的那样,您可以为此使用 Spring Data,但您可能更喜欢也可能不喜欢的替代方法是使用 MongoDB 的更底层的 Java 驱动程序。请查看 MongoDB Java Driver 3.xMongoDB Java Driver 2.x 文档以获取有关使用该驱动程序的说明。

      基本上,你需要做的是:

      MongoDB Java 驱动程序 3.x

      MongoClient mongoClient = new MongoClient();
      MongoDatabase db = mongoClient.getDatabase("test");
      MongoCollection coll = db.getCollection("testCollection");    
      BasicDBObject query = new BasicDBObject("_id", "51a29f6413dc992c24e0283e");
      
      try (MongoCursor<Document> cursor = collection.find(query).iterator()) {
          while(cursor.hasNext()) {
              System.out.println(cursor.next());
          }
      }
      

      MongoDB Java 驱动程序 2.x

      MongoClient mongoClient = new MongoClient();
      DB db = mongoClient.getDB("test");
      DBCollection coll = db.getCollection("testCollection");    
      BasicDBObject query = new BasicDBObject("_id", "51a29f6413dc992c24e0283e");
      
      try (DBCursor cursor = coll.find(query)) {
          while(cursor.hasNext()) {
              System.out.println(cursor.next());
          }
      }
      

      这将打印出集合中具有字段_id 和值51a29f6413dc992c24e0283e 的所有文档。

      【讨论】:

      • 有人否决了这个?有兴趣知道它有什么问题。我没有测试它,但它实际上是从文档中复制粘贴的。
      • 有三个方面:第一,不是Spring Data做不到。我正要准备一个答案,看看它是如何工作的。其次,您正在将内容转储到标准输出,而不是返回String。第三,您的代码没有处理任何异常等。我知道这是示例代码,但是您可以立即使用 if 您使用 Spring Data,因此在使用 Spring Data 实现其他所有内容的场景中使用您的代码会导致行为不一致。
      • 如果您可以使用 spring 数据来做到这一点,那么看看您如何使用它会很有趣。至于返回一个字符串,而不是处理异常,这些都是微不足道的。任何称职的程序员都可以弄清楚如何返回cursor.next() 的结果,而不是系统输出它。
      • 明白了。一般来说,您显示的代码没有任何问题。只是人们希望在使用 SD MongoDB(异常翻译等)时获得某些行为,而您的示例没有获得这些行为。由于原始发布者似乎在他的代码中使用 SD MongoDB 并且明确要求它,我认为“你应该使用其他东西”不是处理它的好方法。这就像有人要一个 Android 应用程序,你告诉他“买一个 iPhone”:)。没有冒犯的意思!我刚刚发布了我的答案:简而言之 - 它会在一段时间内运行 OOTB,但现在可以轻松实现。
      【解决方案3】:

      现在有两种方法可以做到这一点:

      1。在MongoTemplate 上使用CollectionCallback

      你可以直接使用CollectionCallback来处理返回的DBObject,简单的toString()它:

      template.execute("jvmInfo", new CollectionCallback<String>() {
        String doInCollection(DBCollection collection) {
          DBCursor cursor = collection.find(query)
          return cursor.next().toString()
        }
      }
      

      您仍然可以将异常翻译成 Spring 的 DataAccessExceptions。请注意,这有点脆弱,因为我们希望查询只返回一个结果,但这可能是您在尝试生成 String 时必须注意的事情。

      2。将ConverterDBObject注册到String

      您可以实现一个 Spring Converter 来为您执行 toString()

      class DBObjectToStringConverter implements Converter<DBObject, String> {
        public String convert(DBObject source) {
          return source == null ? null : source.toString();
        }
      }
      

      然后您可以使用 XML 配置或覆盖 customConversions() 以返回 new CustomConversions(Arrays.asList(new DBObjectToStringConverter())) 以将其注册到您的 MongoConverter。然后,您可以简单地执行以下操作:

      String result = mongoTemplate.findOne(basicQuery, String.class, "jvmInfo");
      

      我会将刚刚展示的转换器添加到 Spring Data MongoDB 并默认为即将发布的 1.3 GA 版本注册它,并将修复移植回 1.2.x,作为修复 DATAMONGO-743 的一部分。

      【讨论】:

      • 我有一个问题!我可以用 MongoRepository 做同样的事情吗?
      猜你喜欢
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      相关资源
      最近更新 更多