yopp
Поле в посте — счётчик в смысле.
Николаич
А как быть с комментариями? Есть две модели - Post и Answer. Комментировать можно и пост, и ответ на пост.
То есть при создании комментария я передаю ID поста или ответа и какой-то флаг, указывающий на то к какой модели коммент?
Типа target_type: 'Post' // Answer
yopp
Materialized Path
Николаич
И напоследок такой вопрос:
PostSchema
.virtual('comments')
.get(function () {
// Нормально будет, если здесь возвращать массив комментариев?
// Выполнять populate по коллекции Comments?
return []
})
P&P
натолкнулся вот на такой баг : https://jira.mongodb.org/browse/SERVER-14322
P&P
как правильно разрешать на клиенте ситуацию? Ловить duplicate key exception ? Или есть элегантнее способы? Спасибо
Николаич
Николаич
В коллекции Comments лежат комментарии, но комментарии могут относиться не только к Answer, но и к Post.
Как мне указать ref?
target: {
type: Schema.Types.ObjectId,
ref: 'Answer' // но может быть и Post
},
yopp
P&P
Понятно, спасибо, ну я так и делаю Думал может есть какой то элегантный способ.
yopp
Не использовать upsert ;)
P&P
нуууу это понятно) но я lazy
Alexander
а есть какие-то бест практис почитать на тему проектирования под документарные СУБД на подобие монги?
yopp
https://derickrethans.nl/mongo-date-time.html
@rarwin тебе понравится :D
yopp
yopp
и дальше по крупицам собирать подобные статьи
yopp
вообще всё сводится к более простой проблеме — для реляционных и нереляционных данных не все паттерны эффективно работают
yopp
угу, в 3.6
Николаич
questionSchema
.virtual('slug')
.get(function () {
return translit(this.title || '')
})
Как сделать, чтобы virtual поля не высчитывались, если их не запрашивают явно?
Например я делаю запрос к коллекции, где у меня { select: { author: 1 } } и мне поле slug не нужно. Но оно все равно есть в результате.
Николаич
Решил самописным фильтром
Viktor
Добрый день, это нормальная практика, если _id это строка? Хочу сделать составной ключ типа "tenantId:userId"
Viktor
Оно будет использоваться только для поиска, поиск по отдельным полям мне не нужен
Viktor
У меня на бекенде есть готовая обвязка, которая кеширует и апсертит по _id, но не умеет этого делать по составному ключу, поэтому такой ключик мне бы сделал жизнь приятной
Viktor
остается только вопрос в том насколько это нормальная практика и есть ли другие способы решения
Maksym
нормальная практика. + Экономия на одном индексе)
yopp
Если ключ меньше 1кб, то да.
yopp
Правда если поиск будет не по прямому совпадению или не по префиксу, то без индекса по userId может быть туго.
P&P
Viktor
спасибо за ответы
Nick
я правильно понимаю, что в монге нет отдельных типов для byte и short, и что если мне нужно хранить только диапазон значений от 0 до 10, то всеравно это будет инт и жрать будет все 4 байта?
Nick
или он сумеет сжать его до 1 байта дляя более компактного хранения
yopp
http://bsonspec.org/spec.html
Nick
строка эт конечно инетресный вариант))) чет про такое даж не думал
yopp
Но кажется будет 3 байта
yopp
Да, три
string ::= int32 (byte*) "\x00"
Nick
но строки мне не очень подойдут, мне нужен индекс с услвоием, чтобы большую часть доков не индексировать
yopp
Забей и в интах храни тогда
Nick
да уже)
Nick
но кстати мысль про стринги мне кране сильно понравилась, с такой точки зрения даже не смотрел. обычно наоборот переводил числовые строки в лонги для экономии
yopp
Смысла мало
🔰ш
Вы тут живые?
🔰ш
По какой-то причине нативный драйвер mongodb для node.,js не хочет отдавать нормальный промис и отдает, как я понимаю, курсор
🔰ш
🔰ш
🔰ш
Если тыкать .toArray() или .next() на курсор, то он тупо возвращает все/первое значение
Timur
Оберни с помощью util.promisify
🔰ш
Timur
А, там апи с промисами есть, сорри)
Anonymous
Здравствуйте, подскажите такую вещь.
Есть документ типа:
{
_id: 'ObjectId',
creator: 'ObjectId("ID пользователя")',
//куча нужных полей
comments: [
{
user: ObjectId("ID пользователя"),
comment: String
},
{
user: ObjectId("ID пользователя"),
comment: String
}, {
user: ObjectId("ID пользователя"),
comment: String
}
]
}
Anonymous
нужно подставить в creator {id, name} пользователя
и в каждый эл. массива то же в user
Anonymous
я смог придумать только
aggregate
{
$lookup: {
"from": "users",
"localField": "creator",
"foreignField": "_id",
"as": "creator"
}
},
{$unwind: '$creator'},
{$unwind: {"path": "$comments", "preserveNullAndEmptyArrays": true}},
{
$lookup: {
"from": "users",
"localField": "comments.user",
"foreignField": "_id",
"as": "comments.user"
}
},
{
$unwind: {path: '$comments.user', "preserveNullAndEmptyArrays": true}
},
{$group: сгруппировать в исходное}
затем пробежать по массиву comments и убрать у user ненужные поля
Anonymous
ну пожалуйста..
Nick
а сразу имена в комменте сохранять не?
Nick
чтоб потом за ними не лазить
Anonymous
я подумал , на будущее было бы удобно, если можно было всего юзера вытащить, вдруг что еще понадобится.
Anonymous
up
Nick
вот теперь ест ьсмысл заново задуматься, а надо ли юзера тащить по каждому чиху?
Nick
это тебе не sql
Anonymous
Так дело в том, что я не знаком с sql . Тут стоит mongo , что есть то есть..
Anonymous
я правильно понял, что Mongo не предусматривает большую вложенность обьектов ?
Nick
https://docs.mongodb.com/manual/reference/limits/#Nested-Depth-for-BSON-Documents
Nick
MongoDB supports no more than 100 levels of nesting for BSON documents.
Nick
ну и лимит в 16Мб на документ
Dmitrii
как долго можно итерировать курсор в монге? не за кроется ли он после определенного таймаута автоматом?
yopp
Nick
@dd_bb а это нормально иметь 5к чанков при шардирвоании? и есть ли рекомендации по количеству чанков на ноду?
yopp
А почему ненормально?
Nick
ну мало ли) просто переделали в шарды начали заливать данные и хз как расценивать много это или мало, мол надо чтото предпринимать или нет
Nick
по 2.5к на ноду пока
yopp
Ну нормально.
Nick
нет никаких высоких значений, чтобы начинать что-то предпринимать, например 50к чанков на ноде или 100к
Nick
?
yopp
Цифры мало на что влияют. Единственное неудобство — миграции по сути ограничена одним чанком на ребро графа в единицу времени
yopp
Графа связи между шардами в смысле
Nick
это уже ощутил, пришлось делать пресплит с ручной миграцией пустых чанков
yopp
А так, когда будет тормозить, тогда и надо думать
yopp
Можешь погуглить про выбор размера чанка, это наверное единственный доступный инструмент.
Nick
с эти тоже пришлось столкнуться, т.к. очень частые автосплиты на дефолтных 64мб не давали нормально заливать
Nick
сейчас выставили в максимум 1024, т.к. данных достаточно много, как мне кажется. Кроме как очень долгой миграции одного чанка есть какието пробелмы с этим?