MongoDB删除不在fs.files中的fs.chunks

时间:2012-03-16 13:15:51

标签: mongodb

我在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。

3 个答案:

答案 0 :(得分:12)

我认为除了执行查找然后使用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);

答案 1 :(得分:1)

我发现这种基于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)

答案 2 :(得分:1)

因为我的收藏太大,所以使用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)