我在fs.chunks中有10 GB的数据,我想删除所有不在fs.files上的文档。我已经删除了fs.files中所有我不想要的条目,所以fs.files中的每个id都是我想要保留的文件。
因此,我想要类似于db.fs.chunks.remove({"_id": {$nin: fs.files._id}})或“删除fs.chunks中不存在于fs.files中的所有条目”之类的东西。
编辑:我正在寻找相当于SQL delete from fs_chunks where id not in (select id from fs_files)的mongo。
发布于 2012-03-16 21:46:20
除了执行查找然后使用forEach迭代之外,我不认为有一种简单的方法可以做到这一点。所以就像这样:
function removeChunkIfNoOwner(chunk){
//Look for the parent file
var parentCount = db.fs.files.find({'_id' : chunk.files_id}).count();
if (parentCount === 0 ){
db.fs.chunks.remove({'_id': chunk._id});
print("Removing chunk " + chunk._id);
}
}
db.fs.chunks.find().forEach(removeChunkIfNoOwner);您可以看到,如果您创建一个如下所示的函数,则此方法应该有效:
function listParentFile(chunk){
var parent = db.fs.files.findOne({'_id' : chunk.files_id});
printjson(parent);
}
db.fs.chunks.find().forEach(listParentFile);发布于 2018-12-15 20:07:30
我发现这个基于Mick的解决方案可以更快地处理大量的数据块:
function removeChunkIfNoOwner(files_id){
//Look for the parent file
var parentCount = db.fs.files.find({'_id' : files_id}).count();
if (parentCount === 0 ){
res = db.fs.chunks.remove({'files_id':files_id})
}
}
files = db.fs.chunks.distinct('files_id').forEach(removeChunkIfNoOwner)发布于 2019-10-02 20:05:49
使用distinct对我不起作用,因为我的集合太大了。对Bas的查询稍作修改就可以了。
function removeChunkIfNoOwner(chunk){
var parentCount = db.fs.files.find({'_id' : chunk.files_id}).count();
if(parentCount === 0){
res = db.fs.chunks.remove({'files_id':chunk._id})
print("item removed")
}
}
files = db.fs.chunks.find({files_id:{$exists:1}},{data:0}).forEach(removeChunkIfNoOwner)https://stackoverflow.com/questions/9737953
复制相似问题