Sergey
Dmitriy
yopp
Хотите помочь — дайте ссылку
Sergey
да, спасибо, уже тоже нашел
На secondary подсчёт count с помощью aggregate тоже может некорректные результаты выдать при использовании read concern "available".
yopp
yopp
А ссылки правильные дают, да
yopp
yopp
вы увидите счётчик в какой-то момент
yopp
какой это момент — ¯\_(ツ)_/¯
yopp
если вы показываете статистику привязанную к времени, используйте условие по времени
Dmitriy
ага, я понял, еще раз спасибо
и еще такой момент, я правильно помню, что skip в монго очень накладная операция из-за перебора всех записей для получения среза? и дешевле использовать limit + > _id? (где _id последний objectId ранее отданного среза)
Sergey
Dmitriy
yopp
не стоит ничего делать, пока вы не упрётесь в конкретные проблемы
yopp
skip и limit сильно зависят от запроса
yopp
и от размера коллекции
yopp
или индекса
yopp
смотрите explain, настройте дешборд
Dmitriy
yopp
https://www.percona.com/software/database-tools/percona-monitoring-and-management
Dmitriy
Viktor
@dd_bb $lookup до сих пор не умеет в индексы?
Al
Народ подскажите пожалуйста как оптимально в древовидной структуре построенной с parentid, выбрать потомков узла?
graphLookup ? рекурсия? ...
yopp
yopp
Почему такое ограничение?
Bro
https://dumpz.org/bqANNaAfWX6d подскажите почему даже при наличии индексов монго почти всю коллекцию сканирует?
Bro
сделал составной тоже тупит уже минуту
Bro
а если есть поле которого нет в большей части документов может сделать sparse index?
Bro
db.queue_profiles.createIndex({"payload.remove": 1, finished_at: -1})
Bro
Спасибо
Bro
Что делать в такой ситуации?
yopp
Если в результате всех этих вычисления 0 документов, то вы правильно начали смотреть в сторону sparse/partial индексов
Bro
Спасибо! Щаз разберусь
Al
let path = []
while (folder && folder.parent) {
folder = await Folder.findOne({ _id: folder.parent }).exec()
path.push(folder.name)
}
path.reverse().join(" / ")
Al
как такое переписать без рекурсии? это получение потомков для узла дерева.
yopp
использовать materialized path
yopp
вы можете конечно приспособить туда $graphLookup, потому что дерево это частный случай графа, но в случае с путями это один из самых эффективных и простых паттернов
yopp
потому что $graphLookup вы просто рекурсивный поиск в монгу перенесёте
Al
использовать materialized path
нет .. владелец проекта против всего кроме обычной структуры с родителями... там оно может часто меняться...
рекурсия внутри монги.. ну если там уровень вложенность несколько папок.. ну от силы 10, это что прямо ужас не оптимально?
yopp
тогда оставьте как есть, до момента пока не упретесь в проблемы с производительностью
Al
думаете обычный while не хуже graph lookuop
yopp
я думаю что нет смысла оптимизировать, пока нет проблемы
Al
по производительности гарантии от багов.. или случайных каких то бесконечных циклов (ну мало ли)
yopp
добавьте проверку на максимальный уровень вложенности
Kool
Al
Павел 💻
Всем привет, подскажите, как указать с какой коллекцией работать?
Al
const FolderSchema = new mongoose.Schema(
{
name: { type: String, required: true },
isFile: { type: Boolean, required: true },
isRoot: { type: Boolean, default: false },
//trashedAt: { type: Date, index: true },
deletedAt: { type: Date, index: true },
parent: {
type: mongoose.Schema.Types.ObjectId,
index: true,
ref: "Folder"
},
user: {
type: mongoose.Schema.Types.ObjectId,
index: true,
ref: "User",
required: true
}
},
{
versionKey: false
}
)
const folderWithParents = await Folder.aggregate([
{ $match: { _id: folder._id } },
{
$graphLookup: {
from: "Folder",
startWith: "$parent",
connectFromField: "parent",
connectToField: "_id",
as: "ancestors",
depthField: "depth"
//restrictSearchWithMatch: { parent: { $ne: null } }
}
}
]).exec()
console.log("path", folderWithParents)
Al
не работает..
выдает
path [ { _id: 5bec038d7f1fea178c85d4d4,
isRoot: false,
user: 5bec033c7f1fea178c85d4cf,
parent: 5bec03887f1fea178c85d4d3,
name: '1234',
isFile: false,
ancestors: [] } ]
потомков не отдает... пробовал без match нет все равно отдает все доки, но без потомков
Al
название полей совпадает.. в чем же дело?
Nick
connectFromField и connectToField точно в правильно прописаны?
Nick
мож наоборот?
Al
parent коннектится к _id
Al
может надо в схеме явно _id указать?
Al
Al
действительно parent совпадает с id
Al
db.getCollection('folders').find({ parent: ObjectId("5bead35b46a61f3d3c8e5e65") })
db.getCollection('folders').find({ _id: ObjectId("5bead35b46a61f3d3c8e5e65") })
Al
вот так работает.. те связка есть
Al
from: "folders", а не
from: "Folder"
вот что надо было
Nick
бло
Nick
пока разглядывал доку и скрины уже и помощь не понадобилась)
Alexander
Народ, кто может оценить затратность такого кода в монге?
const median = function(arr) {
arr = arr.slice(0);
var middle = (arr.length + 1) / 2,
sorted = arr.sort();
return (sorted.length % 2) ?
sorted[middle - 1] :
(sorted[middle - 1.5] + sorted[middle - 0.5]) / 2;
};
мне надо в аггрегации это считать. массив около 3000-4000 чисел и в фасетке таких аггрегаций 8 штук. Запускается раз в сутки ночью.
Alexander
монга 3.6
Nick
Alexander
Kool
Alexander
Nick
1. инициализация в одной строке двух переменных
2. тернарный опаратор, один из операндов которого - сложное выражение
Nick
ну и компаратор в сортировки в данном контексте конечно лишнее, но не зная о содержимом вот вообще нихерена неясно что там в сделается в середине
Alexander
Nick
Nick
разве что сортировка будет на стороне монги
Alexander