我有一个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上面的内容。
相关分类