猫鼬:无法从没有数据字段的 .chunk 集合中获取文件文档
Mongoose: Cannot fetch file documents from .chunk collection without the data field
我正在尝试从文件 中删除尚未完全上传 到 MongoDB 数据库的块。
当直接上传文件到 MongoDB 时,Mongoose、Multer & GridFSBucket 包 将媒体文件数据分成 2 个子-collections for the media collection: media.chunks & media.files.
为了手动删除存储在 media.chunks 集合中的文件块,您需要 文件的 ID ,它存储在 media.files 和 media.chunks 集合中( 文件元数据仅在文件已完全上传后才会出现在 .files 集合中 )。但是,虽然未完整上传的文件出现在 .chunks 集合中,它们不会出现在 .files 集合中!这意味着虽然我可以从 media.files 集合中获取完整上传的文件文档以便使用它们的 ID 删除它们,但我不能对不完整的文件执行相同的操作。 因此,为了删除不完整的文件,直接从 .chunks 集合中获取文件文档是必要的。
虽然我可以从 .chunks 集合中获取文件文档,但我不能 select 只从集合中获取文件 ID。由于文档数据太大,这会导致“错误:达到最大响应大小”错误响应。当您获取数据时,它也非常慢。
这是我的 Node.js 从 .chunks 子集合中获取所有文件 ID 的途径 行不通:
// Get the file IDs from the media.chunks collection.
router.get('/chunks', async function(req, res, next){
var chunksQuery = await db.collection('media.chunks').find({},{data:0});
chunksQuery.toArray(function(error, docs) {
console.log(docs)
return res.json(docs);
});
});
我也尝试过 .select() 但它不起作用:
// Does NOT work.
var chunksQuery = await db.collection('media.chunks').find().select('-data');
// Does NOT work either.
var chunksQuery = await db.collection('media.chunks').find().select('-media.chunks.data');
我相信我已经弄明白了。有可能 通过 distinct() 方法:
// Get the distinct file IDs that correspond to each upload.
db.collection('media.chunks').distinct('files_id', function(error, results){
console.log('Distinct file ID results',results);
return res.status(200).send();
});
我正在尝试从文件 中删除尚未完全上传 到 MongoDB 数据库的块。
当直接上传文件到 MongoDB 时,Mongoose、Multer & GridFSBucket 包 将媒体文件数据分成 2 个子-collections for the media collection: media.chunks & media.files.
为了手动删除存储在 media.chunks 集合中的文件块,您需要 文件的 ID ,它存储在 media.files 和 media.chunks 集合中( 文件元数据仅在文件已完全上传后才会出现在 .files 集合中 )。但是,虽然未完整上传的文件出现在 .chunks 集合中,它们不会出现在 .files 集合中!这意味着虽然我可以从 media.files 集合中获取完整上传的文件文档以便使用它们的 ID 删除它们,但我不能对不完整的文件执行相同的操作。 因此,为了删除不完整的文件,直接从 .chunks 集合中获取文件文档是必要的。
虽然我可以从 .chunks 集合中获取文件文档,但我不能 select 只从集合中获取文件 ID。由于文档数据太大,这会导致“错误:达到最大响应大小”错误响应。当您获取数据时,它也非常慢。
这是我的 Node.js 从 .chunks 子集合中获取所有文件 ID 的途径 行不通:
// Get the file IDs from the media.chunks collection.
router.get('/chunks', async function(req, res, next){
var chunksQuery = await db.collection('media.chunks').find({},{data:0});
chunksQuery.toArray(function(error, docs) {
console.log(docs)
return res.json(docs);
});
});
我也尝试过 .select() 但它不起作用:
// Does NOT work.
var chunksQuery = await db.collection('media.chunks').find().select('-data');
// Does NOT work either.
var chunksQuery = await db.collection('media.chunks').find().select('-media.chunks.data');
我相信我已经弄明白了。有可能 通过 distinct() 方法:
// Get the distinct file IDs that correspond to each upload.
db.collection('media.chunks').distinct('files_id', function(error, results){
console.log('Distinct file ID results',results);
return res.status(200).send();
});