У меня есть BSON
файл, полученный из mongoexport
базы данных.Давайте предположим, что база данных todo
, а коллекция items
.Теперь я хочу загрузить данные в автономном режиме в мое приложение RN.Поскольку коллекция может содержать произвольное количество документов (скажем, на данный момент 2), я хочу использовать метод для анализа файла, сколько бы документов в нем ни было.
Я пробовал следующие методы:
- Использовать внешний
bsondump
исполняемый файл.
Мы можем преобразовать файл в JSON
с помощью внешней команды
bsondump --outFile items.json items.bson
Но я разрабатываю мобильное приложение, поэтомувызов стороннего исполняемого файла в команде оболочки не идеален.Кроме того, выходные данные содержат несколько строк однострочных объектов JSON , поэтому технически выходные данные не являются правильным файлом 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
in
js-bson
let docs = []
bson.deserializeStream(fs.readFileSync(PATH_HERE), 0, 2, docs, 0)
Но для этого метода требуется параметр количества документов (2 здесь).
Использовать
bson-stream
библиотеку
Я на самом деле использую react-native-fetch-blob
вместо fs
, и согласно их документации, у объекта потока нет метода pipe
, которыйединственный метод, продемонстрированный в bson-stream
док.Поэтому, хотя этот метод не требует количества документов, я не совсем понимаю, как его использовать.
// 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
выше.