yopp
особенно если у вас там сотни записей
Nick
вы сами гвоорите что это апи, причем тут поместится или нет? клиент в браузере сам решит какую порцию данных нужно показывать
yopp
в продакшне обновлялся кто?)
с какой на какую? или вобще?
Nick
как тогда до unwind отсечь более менее лишнее..
поконкретнее что такое "лишнее"
yopp
обновлялся :)
Aga
а у ancerstors нет ancestors?
Al
точнее вот так. после sort но до группировки с пушем. которую надо отсечь
Nick
можете проще - до - после
Al
вот тут надо оставить только выделенное..
yopp
Вообще
https://docs.mongodb.com/manual/release-notes/4.0/#upgrade-procedures инструкции достаточно простые
Al
ну или до sort то оставить тока выделенное а сортировать на клиенте..
Al
как это верно сделать? видимо как нибудь unwind и project ?
Nick
как это верно сделать? видимо как нибудь unwind и project ?
именно, анвинд, потом прожектом делаете структуру которая нужна
Al
именно, анвинд, потом прожектом делаете структуру которая нужна
это касательно последнего скрина? можете показать конкретнее что именно unwind ?
Nick
причем если вам не нужная информция о родителе, то можете сразу от паренда прожектом оставить только поле id
Al
а если и id не оставлять?
Al
вот...
Al
сортировать на клиенте.. ну а как тут избавится от вложенности "ancestors" ?
Nick
{ $match: { _id: folderId } }, {$project: {_id:1}}, { $graphLookup: { from: "folders", startWith: "$parent", connectFromField: "parent", connectToField: "_id", as: "ancestors", depthField: "depth" //restrictSearchWithMatch: { parent: { $ne: null } } } }, { $unwind: "$ancestors" }, {$project: { _id:ancestors._id, isRoot:ancestors.isRoot, .... }}, { $sort: { "depth": -1 } }
Nick
и все, если вам родитель не вперся и потом ничего группирвоать не нужно и вы просто получаете список доков в нужном вам порядке
Nick
как хотите его уже клиенту отадавайте
Al
{$project: {_id:1}},
Al
верхний project что бы родителя убрать?
Al
c верхним project lookup не робит...
Nick
ну еще может $parent оставьте
Nick
{$project: {_id:1}},
Al
const folderWithAncestors = await this.aggregate([ { $match: { _id: folderId } }, { $graphLookup: { from: "folders", startWith: "$parent", connectFromField: "parent", connectToField: "_id", as: "ancestors", depthField: "depth" //restrictSearchWithMatch: { parent: { $ne: null } } } }, { $unwind: "$ancestors" }, { $project: { _id: "$ancestors._id", isRoot: "$ancestors.isRoot", name: "$ancestors.name", depth: "$ancestors.depth" } }, { $sort: { depth: -1 } }
Al
{ "result": [ { "_id": "5bec033c7f1fea178c85d4d0", "isRoot": true, "name": "Root", "depth": 3 }, { "_id": "5bec03837f1fea178c85d4d2", "isRoot": false, "name": "12", "depth": 2 }, { "_id": "5bec03887f1fea178c85d4d3", "isRoot": false, "name": "123", "depth": 1 }, { "_id": "5bec038d7f1fea178c85d4d4", "isRoot": false, "name": "1234", "depth": 0 } ] }
Al
все как надо. верхний project не нужен
Al
$project: { _id: "$ancestors._id", isRoot: "$ancestors.isRoot", name: "$ancestors.name", depth: "$ancestors.depth" } как понимаю вот этим мы избежали группировку и push тем что убрали одну вложенность массива
Al
спасибо!
Al
yopp
🤦🏼‍♀️
Al
да, убрали вложенность и собственно что так что так у вас уже получился нужный вам список
хорошо. попробую вывести и буду надеятся что тормозить не будет
Nick
🤦🏼‍♀️
а чего не так?)
Al
а рекурсия в цикле.. одна итерация подвисла и считай все подвисло..
Al
🤦🏼‍♀️
типа я такой..
yopp
а чего не так?)
забили гвоздь микроскопом ;)
Nick
забили гвоздь микроскопом ;)
там даже наверное не только микроскопом)))
yopp
6 человекочасов на то, что с MP/AP делается за час. и это только начало всех приключений
Nick
а можно расшифровать mp/ap?
yopp
materialized path / ancestry path
Al
materialized path / ancestry path
но это же при любом изменении надо update'ить
yopp
не надо
Al
а там еще эти папки могут быть расшарены между юзерами..
yopp
ACL к хранению дерева никак не относится
Al
ACL к хранению дерева никак не относится
допустим папку переместили .. и у нее совсем другие потомки... ancestry path ведь надо перестроить? а сейчас только parent апдейтить..
Al
путь вывелся..
Al
по мне работает и не тормозит.. то что сейчас нужно..
Al
а там еще неизвестно выстрелит ли проект, какие реально будут данные.. можно и переделать будет если надо..
Al
хотя еще проблему с "мягким удалением" вижу... а можно ли как то update несколько объектов и их дочерние если они есть?
Al
Или уж тут без цикла никак..
Kool
путь вывелся..
а что вы делаете
Al
а что вы делаете
файловый сайт. А сейчас мягкое удаление.. и хочу сделать его каскадным для дочерних..
Kool
почему бы не воспользоваться готовым решением, например webdav
Kool
имхо велосипед
Kool
можно конечно и через монгу сделать
Kool
но зачем
Kool
вам полюбому нужен просто какой то протокол который поверх бека обернуть
Kool
уверен решения есть
Al
само хранение файлов будет через запросы бека к внешнему cdn сервису.
Al
тк с физическими файлами особо и не будем работать..
Al
но по мне тут велосипед так велосипед.. я же на постоянке. Надо сделать что бы четко работало. а там пусть решает заказчик
Al
FolderSchema.pre("save", async function(next) { console.log("folderShema pre save", this.isModified("deletedAt"), this.deletedAt) if (this.isModified("deletedAt")) { console.log("folder updated", this._id, this.deletedAt) } return next() })
Al
вот такая штука что то не работает...
Al
const result = await Folder.update( { _id: { $in: folderIds }, parent: folder._id, user: user._id }, { $set: { deletedAt: Date.now() } }, { multi: true } ) после такого update хук срабатывает. а deletedAt в нем false null
Al
а мне надо апдейтить дочерние каскадно..
Al
имхо велосипед
лично я бы такое не затеял)
Al
"pre('save') gets executed before a save() call. update() is not the same function as save(). However, 4.0.0-rc2 does have support for pre('update') hooks :)" вот в чем дело..
Al
В общем пока не нашел способ оптимально каскадно обновлять вложенные объекты. В хуке или без него.. это нечто похожее на вложенные циклы и рекурсию..
Bro
добрый день господа
Bro
@dd_bb а походу нет решения нормального для $exists