Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中直接从mongodb查询返回原始JSON?_Java_Spring_Mongodb_Spring Data_Spring Data Mongodb - Fatal编程技术网

如何在Java中直接从mongodb查询返回原始JSON?

如何在Java中直接从mongodb查询返回原始JSON?,java,spring,mongodb,spring-data,spring-data-mongodb,Java,Spring,Mongodb,Spring Data,Spring Data Mongodb,我有以下代码: @RequestMapping(value = "/envinfo", method = RequestMethod.GET) @ResponseBody public Map getEnvInfo() { BasicQuery basicQuery = new BasicQuery("{_id:'51a29f6413dc992c24e0283e'}", "{'envinfo':1, '_id': false }"); Map envinfo= mongoTemp

我有以下代码:

@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;
}
正如您所注意到的,代码:

  • 从MongoDB检索JSON
  • 将其转换为
    Map
    对象
  • 然后,Spring MongoData将
    Map
    对象转换为JSON,然后将其返回到浏览器

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

    正如Oliver所指出的,您可以使用Spring数据,但是您可能喜欢也可能不喜欢使用MongoDb更低级的Java驱动程序。有关使用该驱动程序的说明,请参阅或文档

    基本上,您需要做的是:

    MongoDB Java驱动程序3.x
    这将打印出集合中所有具有值为
    51a29f6413dc992c24e0283e的字段
    \u id
    的文档。现在有两种方法可以执行此操作:

    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()
      }
    }
    
    然后,您可以使用XML配置或重写
    customConversions()
    以返回
    新的customConversions(Arrays.asList(new DBObjectToStringConverter())
    ,以便在
    MongoConverter
    中注册它。然后,您可以简单地执行以下操作:

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

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

    有人对此投了反对票吗?我很想知道它有什么问题。我没有测试它,但它实际上是从文档中复制粘贴的。有三个方面:首先,并不是你不能使用Spring数据。我正要准备一个答案,看看它是如何工作的。其次,您正在将内容转储到标准输出,而不是返回
    字符串。第三,您的代码没有处理任何异常或类似情况。我知道这是一个示例代码,但如果使用Spring数据,所有这些都是现成的,因此在使用Spring数据实现所有其他内容的场景中使用代码会导致不一致的行为。如果可以使用Spring数据,那么看看如何使用它会很有趣。至于返回字符串,而不处理异常,这些都是非常简单的。任何称职的程序员都能想出如何返回cursor.next()的结果,而不是系统输出。明白了。一般来说,您显示的代码没有问题。只是人们希望在使用SD MongoDB(异常翻译等)时获得特定的行为,而在您的示例中却没有。由于最初的海报似乎使用SD MongoDB作为他的代码,并明确要求使用它,我认为“你应该使用其他东西”并不是处理它的好方法。这就像有人要一个Android应用程序,你告诉他“买个iPhone”:。无意冒犯!我刚刚发布了我的答案:简言之,它将在OOTB中起作用,但现在已经很容易实现了。我有一个问题!我可以用MongoRepository做同样的事情吗?
    
    template.execute("jvmInfo", new CollectionCallback<String>() {
      String doInCollection(DBCollection collection) {
        DBCursor cursor = collection.find(query)
        return cursor.next().toString()
      }
    }
    
    class DBObjectToStringConverter implements Converter<DBObject, String> {
      public String convert(DBObject source) {
        return source == null ? null : source.toString();
      }
    }
    
    String result = mongoTemplate.findOne(basicQuery, String.class, "jvmInfo");