流星Mongo GridFS无需转储即可将文件和块复制到另一个DB

时间:2019-05-05 12:04:41

标签: mongodb meteor gridfs ddp

背景

我有两个连接到自己MongoDB实例的Meteor应用程序。一个应用程序(称为消费者)会在启动时同步由/上传到另一应用程序(称为 provider )创建的文件和文件

消费者通过DDP连接到 priver ,可以认为远程身份验证有效。

其中一些集合包含引用文件/块的文档,这些文件/块使用GridFS存储。这些文档包含每个文件版本的GridFS文件ID(由于上传后处理,文件存在子版本):

{
  "version": {
    "original": {
      "gridFsId": "5c9cd012bc653477f1857e00"
    },
    "thumbnail": {
      "gridFsId": "5c9cd012bc653477f1857e01"
    }
  }
}

问题

我也想将文件/块与我的消费者应用程序同步,但仅限于应用程序级别。

因此是否可以在没有mongodump的情况下将GridFS存储桶中的块和文件“复制”到远程存储桶中,例如使用openDownloadStream

代码

目前,在我的Meteor方法中,我正在迭代FilesCollection的所有游标(请参阅ostrio:files),并尝试访问GridFsBucket以从流中读取:

function sync ({ name }) {
  const FilesCollection = // ... get files collection by name
  const allCursors = FilesCollection.find()
  const allMapped = []
  allCursors.forEach(cursor => {
    console.log(cursor)
    const { versions } = cursor
    const mapped = { _id: cursor._id, versions: {} }
    console.log(versions)
    Object.keys(versions).forEach(version => {
      const fileId = cursor.versions[version].meta.gridFsFileId

      // I assume this part won't work
      // because it is async and Meteor.wrapAsync works
      // only ell for callbacks with pattern cb(err, res)
      const downloadStream = gridFSBucket.openDownloadStream(fileId)
      mapped.versions[version] = // get binary from download stream
    })
    allMapped.push(mapped)
  })
  console.log(allMapped.length)
  return allMapped
}

Meteor.methods({sync})

侧注

我首选的连接是DDP,但如果通过DDP不能正常工作,我也可以为基本HTTP请求创建一个端点。

0 个答案:

没有答案