Использование mongorestore для вставки многих документов во временную коллекцию - PullRequest
1 голос
/ 12 февраля 2020

У меня есть массив объектов.

const arr = [
  {
    name: 'somename',
    age: 25,
  },
  {
    name: 'othername',
    age: 15,
  },
]

Когда я обновляю свою коллекцию следующим образом:

MyCollection.insertMany(arr);

она работает правильно. Коллекция имеет 2 объекта, соответствующих переменной arr.

Я также хочу сохранить эти данные во временной коллекции. Вот так:

const fileName = '/tmp/some_data.bson';
const data = BSON.serialize(arr); //arr from above
await fs.writeFile(fileName, data);
await child_process.exec(`mongorestore --drop -d my-db -c my_collection_temp ${fileName}`);

Это работает, но коллекция temp содержит только 1 объект (вместо 2), и этот 1 объект имеет 2 поля, каждое из которых имеет 2 поля.

Вид выглядит примерно так:

Основная коллекция:

Object1 { name: 'somename', age: 25 }
Object2 { name: 'someothername', age: 15 }

Temp Collection:

Object 1 {

  0: {
    name: 'somename', age: 25
  }
  1: {
    name: 'someothername', age: 15
  }

}

Я получаю, что когда я выполняю mongorestore --drop -d my-db -c my_collection_temp ${fileName}, он просто сбрасывает Буфер в коллекцию, но мне нужен способ пропустить это и распространить объект как в основной коллекции.

Другими словами, я думаю, что я хочу имитировать от insertMany до mongorestore

Любая помощь приветствуется,

1 Ответ

3 голосов
/ 12 февраля 2020

Когда вы вызываете BSON.serialize(arr), вы сериализуете массив в один объект BSON.

Используйте bsondump для сравнения файла, сгенерированного таким образом, с файлом, сгенерированным с помощью mongodump, для экспорта этой коллекции.

Формат файла, который ожидает mongorestore, представляет собой серию сериализованных документов BSON.

Файл bson, содержащий 2 документа в вашем сообщении, будет выглядеть следующим образом:

00000000: 3600 0000 075f 6964 005e 4354 a93f 9947  6...._id.^CT.?.G
00000010: 050e 9bfc 0802 6e61 6d65 0009 0000 0073  ......name.....s
00000020: 6f6d 656e 616d 6500 0161 6765 0000 0000  omename..age....
00000030: 0000 0039 4000 3700 0000 075f 6964 005e  ...9@.7...._id.^
00000040: 4354 a93f 9947 050e 9bfc 0902 6e61 6d65  CT.?.G......name
00000050: 000a 0000 006f 7468 6572 6e61 6d65 0001  .....othername..
00000060: 6167 6500 0000 0000 0000 2e40 00         age........@.

Обратите внимание, что первый документ начинается с байта 0 со своим размером и продолжается до байта 0x35.

Второй документ начинается сразу с байта 0x36 с его размером и продолжается до конца файла байтами 0x6 c.

Чтобы сгенерировать этот файл, вам нужно вызвать BSON .serialize для каждого документа по очереди и добавьте байты в выходной файл.

...