如何在 JavaScript 中使用任意多个文档反序列化转储的 BSON?

我有一个BSON来自mongoexport数据库的文件。让我们假设数据库是todo,集合是items。现在我想将数据离线加载到我的 RN 应用程序中。由于集合可能包含任意多个文档(目前假设为 2 个),我想使用一种方法来解析文件,无论它包含多少个文档。


我尝试了以下方法:


使用外部bsondump可执行文件。

我们可以JSON使用外部命令将文件转换为


bsondump --outFile items.json items.bson

但是我正在开发一个移动应用程序,因此在 shell 命令中调用第三方可执行文件并不理想。另外,输出包含几行单行 JSON objects,因此输出在技术上不是正确的 JSON 文件。所以事后解析并不优雅。


使用deserialize在js-bson库

根据js-bson文档,我们可以做


const bson = require('bson')

const fs = require('fs')

bson.deserialize(fs.readFileSync(PATH_HERE))

但这会引发错误


Error: buffer length 173 must === bson size 94

并通过添加此选项,


bson.deserialize(fs.readFileSync(PATH_HERE), {

    allowObjectSmallerThanBufferSize: true

})

错误已解决,但仅返回第一个文档。因为文档没有提到这个函数只能解析1个文档的集合,不知道有没有什么选项可以实现多文档阅读。


使用deserializeStream中js-bson

let docs = []

bson.deserializeStream(fs.readFileSync(PATH_HERE), 0, 2, docs, 0)

但是此方法需要文档计数的参数(此处为 2)。


使用bson-stream图书馆

我实际上使用的是react-native-fetch-blob代替fs,并且根据他们的文档,流对象没有pipe方法,这是bson-streamdoc 中演示的唯一方法。所以虽然这个方法不需要文档数量,但是我很困惑如何使用它。


// fs

const BSONStream = require('bson-stream');

fs.createReadStream(PATH_HERE).pipe(new BSONStream()).on('data', callback);


// RNFetchBlob

const RNFetchBlob = require('react-native-fetch-blob');

RNFetchBlob.fs.readStream(PATH_HERE, ENCODING)

.then(stream => {

    stream.open();

    stream.can_we_pipe_here(new BSONStream())

    stream.onData(callback)

});

另外我不确定ENCODING上面的内容。


拉丁的传说
浏览 221回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript