使用mongorestore将许多文档插入到临时集合中

问题描述 投票:1回答:1

我有一个对象数组。

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 }

临时收藏:

Object 1 {

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

}

[我得到的是,当我执行mongorestore --drop -d my-db -c my_collection_temp ${fileName}时,它只是将Buffer转储到集合中,但是我需要一种方法来忽略它,并像在主集合中那样散布对象。

换句话说,我想我要模拟insertManymongorestore

感谢您的任何帮助,

javascript node.js json mongodb bson
1个回答
3
投票

当调用BSON.serialize(arr)时,您正在将一个数组序列化为单个BSON对象。

使用bsondump将以这种方式生成的文件与使用mongodump导出以导出该集合的文件进行比较。

mongorestore期望的文件格式是一系列序列化的BSON文档。

包含您帖子中2个文档的bson文件将如下所示:

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  [email protected]...._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开始,并一直扩展到文件的末尾字节0x6c。

要生成此文件,您需要依次在每个文档上调用BSON.serialize,并将字节附加到输出文件中。

© www.soinside.com 2019 - 2024. All rights reserved.