我有两个连接到自己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请求创建一个端点。