2

現在、これを http ハンドラーで実行しています。

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

完全な BSON データが入る前に結果の提供を開始するにはどうすればよいですか?

mgo編集:答えは拡張子を超えてbson. mgo私が見る限り、私が間違っていない限り、完全なドキュメントのみを提供します。コード例が明確に示すように、1 つの (おそらく大きい) ドキュメントがあります

4

4 に答える 4

3

これを可能にするには、次のものが必要です。

  1. Reader着信 bson ストリームのa へのアクセス
  2. 一般的なドキュメント パーツのデータ型
  3. Readerから読み取り、ドキュメント パーツを生成するbson のストリーミング デコーダ
  4. ドキュメント パーツを使用してファイルに書き込む json のストリーミング エンコーダーWriter

mgo番号 1 を提供encoding/jsonしません。 番号 2 または 4 をmgo/bson提供しません。 番号 3 を提供しません。 他の言語にはストリーミング json パーサーがありますが ( JSON 用のストリーミング API はありますか? の回答)。

これをしたいというあなたの願望は合理的ですが、サポートはまだ存在していません. さいわい、json と bson は十分に単純であり、使用しているすべてのコンポーネントはオープン ソースであるため、理論上は必要なツールを作成できます。

于 2014-05-10T16:03:51.110 に答える
1

mgo をハッキングする以外に、BSON 全体を非整列化する (したがって、BSON が mgo によって完全に配信されるまで結果を提供しない) ことを回避するためにできることは何もないと思います。その API は、マーシャリングされていないドキュメント全体を処理するだけであり、BSON でエンコードされたものにはアクセスできず[]byteReaderデータが入ってくると要素ごとに 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 に答える