yopp
особенно если у вас там сотни записей
Nick
вы сами гвоорите что это апи, причем тут поместится или нет? клиент в браузере сам решит какую порцию данных нужно показывать
Aga
Nick
yopp
обновлялся :)
Al
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
причем если вам не нужная информция о родителе, то можете сразу от паренда прожектом оставить только поле id
Al
Al
а если и id не оставлять?
Aga
Al
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 оставьте
Al
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
Nick
yopp
🤦🏼♀️
Al
Nick
Al
а рекурсия в цикле.. одна итерация подвисла и считай все подвисло..
Al
yopp
6 человекочасов на то, что с MP/AP делается за час. и это только начало всех приключений
Nick
а можно расшифровать mp/ap?
yopp
materialized path / ancestry path
Al
yopp
не надо
Al
а там еще эти папки могут быть расшарены между юзерами..
yopp
ACL к хранению дерева никак не относится
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
"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