5

mongodump によって生成されたコレクション ダンプを読み込もうとしています。ファイルは数ギガバイトなので、段階的に読みたいと思います。

次のようなもので最初のオブジェクトを読み取ることができます。

buf := make([]byte, 100000)
f, _ := os.Open(path)
f.Read(buf)

var m bson.M
bson.Unmarshal(buf, &m)

ただ、どれだけbufを消費したか分からないので、次の読み方が分かりません。

これはmgoで可能ですか?

4

4 に答える 4

4

mgobson.Unmarshal()だけを使用するだけでは十分ではありません。この関数は[]byte、単一のドキュメントを表す を取得し、それを値に非整列化するように設計されています。

ダンプ ファイルから次のドキュメント全体を読み取ることができる関数が必要になります。その後、結果を に渡すことができますbson.Unmarshal()

encoding/jsonこれをorと比較すると、からドキュメントを消費する型がencoding/gobあれば便利でしょう。mgo.bsonReaderio.Reader

とにかく、mongodump のソースから、ダンプ ファイルは単なる一連の bson ドキュメントであり、ファイル ヘッダー/フッターや明示的なレコード セパレータはないようです。

BSONTool::processFileは、mongorestore がダンプ ファイルを読み取る方法を示しています。彼らのコードは 4 バイトを読み取ってドキュメントの長さを判断し、そのサイズを使用して残りのドキュメントを読み取ります。サイズ プレフィックスがbson 仕様の一部であることを確認しました。

これが Go でどのように行われるかを示すPlayground の例を次に示します。長さフィールドを読み取り、ドキュメントの残りを読み取り、非整列化し、繰り返します。

于 2014-06-13T11:20:16.803 に答える
3

このメソッドFile.Readは、読み取ったバイト数を返します。

File.Read

Read は、File から最大 len(b) バイトを読み取ります。読み取ったバイト数と、エラーがあればそれを返します。EOF は、ゼロ カウントによって通知され、err は io.EOF に設定されます。

したがって、読み取った戻りパラメータを格納するだけで、読み取ったバイト数を取得できます。

n, err := f.Read(buf)
于 2014-06-13T06:58:40.970 に答える
2

私は次のコードでそれを解決することができました:

for len(buf) > 0 {
    var r bson.Raw
    var m userObject

    bson.Unmarshal(buf, &r)
    r.Unmarshal(&m)

    fmt.Println(m)

    buf = buf[len(r.Data):]
}
于 2014-06-16T09:18:31.647 に答える