如何为 GridFS 集合创建猫鼬模型?

Ano*_*ous 4 mongoose mongodb node.js gridfs

所以我试图为 GridFS 集合创建一个猫鼬模型,但没有成功。

let bucket;
(async () => {
    try {
        await mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true });
        const { db } = mongoose.connection;
        bucket = new mongoose.mongo.GridFSBucket(db, { bucketName: 'tracks' });
    }
    catch(err) {
        console.log(err);
    }
})();
Run Code Online (Sandbox Code Playgroud)

这是我的课程架构和模型:

const courseSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
    },
    tracks: [{
        type: mongoose.Types.ObjectId,
        ref: 'tracks.files'
    }],
});

const Course = mongoose.model('Course', courseSchema);
Run Code Online (Sandbox Code Playgroud)

这是我的曲目模式和模型:

const trackSchema = new mongoose.Schema({
    length: { type: Number },
    chunkSize: { type: Number },
    uploadDate: { type: Date },
    filename: { type: String, trim: true, searchable: true },
    md5: { type: String, trim: true, searchable: true },
}, { collection: 'tracks.files', id: false });

const Track = mongoose.model('Track', trackSchema);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

MongooseError [MissingSchemaError]: Schema hasn't been registered for model "tracks.files".
Run Code Online (Sandbox Code Playgroud)

当我运行这个:

Course.findById('5d5ea99e54fb1b0a389db64a').populate('tracks').exec()
    .then(test => console.log(test))
    .catch(err => console.log(err));
Run Code Online (Sandbox Code Playgroud)

关于这些东西的文档绝对为零,我快要疯了。我是第一个在 Mongodb 中保存 16 MB+ 文件的人吗?为什么实施起来如此困难?任何人都可以请指导我正确的方向。

小智 7

延迟响应,但尝试替换ref: 'tracks.files'ref: 'trackSchema'.

ref字段在其中被引用populate('trackSchema')并且必须是对另一个架构的引用。如果您想了解有关在 Mongoose 中填充字段和引用的更多信息,请查看保存引用。

我也不建议为实现 GridFS 创建任何类型的模式,我会让 Mongo 来处理这个问题,因为如果实施不正确,它可能会导致文件损坏或丢失/过时的文档。

至于缺少 GridFS 的官方文档,尤其是 GridFS 和 Mongoose,我使用了 Mongo 的原生 GridFsBucket 类(据我所知,目前还没有维护官方 Mongoose-GridFS API),我自己尝试这个时使用的最好的文档是gridfs。这里有一个教程

要将 Mongo 的本机 GridFSBucket 与 Mongoose 一起使用,只需从其mongo属性中获取其属性和 Mongoose 的连接实例connection

const mongoose = require(mongoose);
var gridFSBucket = new mongoose.mongo.GridFSBucket(mongoose.connection.db, {
   bucketName: 'images'
});
Run Code Online (Sandbox Code Playgroud)