Nick
тока хотел написать что у вас проблема, но вы и сами знаете)
Al
то он удалится, а это плохо..
Nick
тут два момент
Nick
если вы работает сбазой напряму, то монжо просто удалять с условием, что что совпадает id и при это счетчик все еще ноль
Nick
но походу ваш случай как раз второй - монгус по идее скрывает для вас пробелму многопточной работы с бд, т.е. во всех частях приложения виден один и тот же док и его состояние. Но мне с трудом представляется как синхронизировать работу с инкрементами/декрементами через монгус, который чтопудово не гарантирует ничего, т.к. синхронизировать вы должны изменения сами на уровне приложения
Nick
ну так remove({_id:...., counter:0})
Nick
и удалит только если в момент выполнения был уже ноль
Dmitry
А ручками обрабатывать.. про то и речь. Типа const hasLink = await Folder.find({ _id: ObjectId( phys._Id )}).exec() If(!hasLink) { phys.remove() }
может будет очень кривой вариант но все же можно хранить каждый файл внутри документа каждого folder, получится денормализация но тогда не придется ничего проверять, но конечно зависит от того как вам нужно получать доступ к этим файлам потом
Dmitry
ну то есть у вас выйдет к пример 100 папок и в каждой будет один и тот же файл вложен
Al
ну так remove({_id:...., counter:0})
Ну можно же не phys.remove, а Phys.deleteOne({ id: .. , counter: 0} ) Но где мы возьмем counter
Al
как он в БД появится?
Dmitry
Ну можно же не phys.remove, а Phys.deleteOne({ id: .. , counter: 0} ) Но где мы возьмем counter
counter придется самому обновлять при каждом удалении, добавлении папки
Nick
ну так вы его туда будете писать
Nick
я ж гвоорю исключительно контроль из ПО
Dmitry
у вас выйдет 10 разных папок, в каждой будет прилинкован один и тот же файл
Dmitry
внутри массива
Dmitry
ну например
Al
counter придется самому обновлять при каждом удалении, добавлении папки
ага то есть такая денормализация.. добавили folder связанные с файлом и тут же обновили counter в phys что бы не удалился..
Al
внутри массива
и папки тоже хранить в массиве... ? нет тут что то не то ;)
Dmitry
скажем у вас файл "file1"
Dmitry
и есть 3 папки: folder1, 2, 3
Dmitry
если денормализовать выйдет
Dmitry
коллекция из папок: folder1: {file: "file1"}, folder2: {file: "file1"}, folder3: {file: "file2"}
Al
я понял.. хранить дубликаты этого phys везде внутри папок к которым прилинкован... тема конечно интересная.. но только с phys связан еще реальный файл на сторадже.. и у phys должен быть уникальный id
Dmitry
ну или folder1: {files: ["file1", "file2"]}
Al
ну или folder1: {files: ["file1", "file2"]}
понял и этот file1 может быть и в другой папке и в третьей..
Dmitry
но это такое
Dmitry
ну да
Al
уникальность не только по _id, но и по sha1 нужна... а отдельной коллекции phys при этом вообще не будет?
Dmitry
ну это все зависит от задачи
Dmitry
если доступаться к файлу можно только через папку то можно денормализовать, а если нужно как-то выводить списки между папками или получать полный список уникальных файлов тогда выходит слишком напряжно с денормализацией
Al
да конечно уникальный по sha1 файлы должны быть доступны без папок..
Al
ну тогда остаются монговские транзакции?
Al
А всякие pre delete не при делах?
Dmitry
да конечно уникальный по sha1 файлы должны быть доступны без папок..
ну это можно делать через агрегацию, например
Dmitry
ну тогда остаются монговские транзакции?
я еще с транзакциями не работал в монге, не знаю :)
Al
https://mongoosejs.com/docs/middleware.html а вот это?
Al
или не обеспечит целостность?
Dmitry
или не обеспечит целостность?
вообще без понятия, пишу на python/go
Dmitry
вообще можно просто раз в день чистить файлы, например
Dmitry
ну типа если в 12:00 на файл ссылается 0 папок - удаляем
Al
ну типа если в 12:00 на файл ссылается 0 папок - удаляем
так мы и хотим их фоновым скриптом удалять..
Dmitry
а, ну тогда не вижу особой проблемы с целостностью...
Al
ну вот в 12:00 ссылается ноль папок.. и тут раз и добавили
Al
Почему?
Dmitry
ну вот в 12:00 ссылается ноль папок.. и тут раз и добавили
добавили файл в папку который уже не должен существовать?
Al
ну сделали в этом фоновом скрипте find увидили 0 папок. И тут добавили файл этот же, а мы увидив в find что нету и можно удалить, его вот этот новый и удалим
Al
но то самое о чем выше писали..
Al
оно и в фоновом скрипте также.
Nick
зачем вообще вам нужно удалять?
Al
Есть мысль сделать вложенные документы в phys
Al
те в phys вкладываем прилинкованные Folder
Dmitry
ну место займут.
это может быть дешевле чем решать вопрос синхронизации этого всего...
Al
Если вложенных документов не остается то делаем remove
Al
это можно сделать одним запросом?
Al
можно ли сделать условие в deleteOne что бы проверяло число вложенных в данный док документов?
Dmitry
не совсем понял что именно, но в любом случае можно сделать batch запрос
Dmitry
выходит папки типа тегов
Dmitry
но что если пока выполняется команда кто-то добавит новый такой же файл? :)
Dmitry
к примеру вы отправили batch запросов на удаление на сервер и именно в это время добавили новый файл
Al
но что если пока выполняется команда кто-то добавит новый такой же файл? :)
весь смысл удалять именно одним запросом... так можно?
Al
если сможем проверять и удалять атомарно тогда и пусть добавляют такой же..
Dmitry
ну в теории есть delay между запросом и выполнением на сервере
Dmitry
короче мне кажется вообще странным идея удаления файлов с привязкой к папке
Dmitry
я так понял нужно удалить не только документ файла но и удалить где-то на диске сам файл
Anton
А есть тут кто-нибудь кто управляет реплика сетом на bare_metal/виртуалках через chef?
Anonymous
ку, можно как-то преобразовывать id в нормальные в монго? а то не очень смотрится адресная строка example.com/post/5bgfdjsnjteretwqeaw
Nick
а что значит "нормальные" ?
Anonymous
красивые