MongoDB удаляет fs.chunks где не в fs.files - PullRequest
4 голосов
/ 16 марта 2012

У меня есть 10 ГБ данных в fs.chunks, и я хочу удалить каждый документ, который не находится в fs.files.Я уже удалил все записи в fs.files, которые мне не нужны, поэтому каждый идентификатор в fs.files - это файл, который я хочу сохранить.

Итак, я хочу что-то вроде 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).

Ответы [ 2 ]

12 голосов
/ 16 марта 2012

Я не думаю, что есть простой способ сделать это, кроме выполнения поиска и последующей итерации с помощью 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 голос
/ 15 декабря 2018

Я нашел, что это решение на основе Мика работает немного быстрее для большого количества фрагментов:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...