2

目前我在 http 处理程序中运行它:

err := mongoCollection.Find(bson.M{"name": vars["name"]}).One(&result)
data, err := json.Marshal(result)
w.Write(data)

如何在完整的 BSON 数据输入之前开始提供结果?

编辑:答案需要超越mgo扩展并进入bson. mgo据我所知,如果我没记错的话,只会提供完整的文件。正如我的代码示例清楚地显示的那样,我有一个(可能很大)文档。

4

4 回答 4

3

为了使这成为可能,您需要这些东西:

  1. 访问Reader传入 bson 流的 a
  2. 通用文档部分的数据类型
  3. 用于 bson 的流式解码器,它读取Reader并生成文档部分
  4. json 的流式编码器,它使用文档部分并写入Writer

mgo不提供数字 1。encoding/json不提供数字 2 或 4。mgo/bson不提供数字 3。尽管在其他语言中存在流式 json 解析器,但谷歌搜索并没有为 Go 中的任何这些点提供任何帮助(参见答案是否有 JSON 的流 API?)。

您这样做的愿望是合理的,但支持尚不存在。幸运的是,json 和 bson 足够简单,而且你使用的所有组件都是开源的,所以理论上你可以编写你需要的工具。

于 2014-05-10T16:03:51.110 回答
1

我不认为你可以做任何事情来避免解组整个 BSON(因此在 mgo 完全交付 BSON 之前不提供结果),除了对 mgo 进行黑客攻击。它的 API 只处理完整的、未编组的文档,无法访问任何 BSON 编码的文档,[]byte或者Reader当数据进入时您可能会按元素进行 bsondecode-then-jsonencode。

于 2014-05-07T16:19:37.960 回答
0

看看chanson,您可以轻松构建和流式传输 json。有一个从通道读取数据以将元素添加到列表的示例。你可能会做类似的事情

于 2015-11-01T18:35:16.603 回答
-1

看看json.Encoder。它将 JSON 对象写入输出流。json.Marshal一次生成一个[]byte并且不提供流。

在 MongoDB 方面看一下mgo.Iter. 如果您的结果中有大量文档,您可以批量序列化它们并提高您的应用程序的内存效率。

使用 json.Encode 的示例:

data := map[string]int{"apple": 5, "lettuce": 7}
enc := json.NewEncoder(w)
enc.Encode(data)

于 2014-05-04T10:21:59.283 回答