Anonymous
ну как это контролировать
yopp
Проверить что когда вы делаете insert во вставляемом документе есть _id
Anonymous
я беру документ из одной коллекции и вставляю его в другую. как контрлировать?
yopp
Скорее всего так и будет, но это зависит от вашего драйвера.
Anonymous
ладно, попробую, видимо станет яснее)
Anonymous
ссыкотно поломать, бекапы заманался делать (по 10Гб бд)
yopp
самый простой вариант dump/restore
Anonymous
какой оператор оптимальней использовать когда есть массив со значениями и надо выбрать документы где поле равно одному из значений из этого массива?
Anonymous
тольок не аггрегация
yopp
$in?
Anonymous
да, спс. последний вопрос!)) почему индекс не дает эффекта? const randomStory = await storiesCollection .aggregate([ { $match: { tags: { $in: tagsArray } } }, { $sample: { size: 1 } }, ]) как было 500ms так и осталось
yopp
из-за $sample
Anonymous
но ведь это самый быстрый способ рандомно выбирать. разве есть другой?
Anonymous
видимо придется истории пронумеровать и потом выборку делать по номеру?
yopp
https://docs.mongodb.com/manual/reference/operator/aggregation/sample/#behavior > If any of the above conditions are NOT met, $sample performs a collection scan followed by a random sort to select N documents. In this case, the $sample stage is subject to the sort memory restrictions.
yopp
используйте псевдослучайный алгоритм
Anonymous
те алгоритмы что я видел включают простановку поля для каждого документа. вы об этом?
yopp
да
yopp
но из-за $in по tags это не очень тривиально
Anonymous
эх..ладно благодарю)
yopp
в принципе случайные выборки в базах данных это всегда неэффективно
Anonymous
но из-за $in по tags это не очень тривиально
что если давать каждому документупорядковый номер, а потом генерить рандом в этих пределах и делать выборку по этому значениюю
yopp
порядковый номер очень плохая идея
yopp
если убрать выборку по tags то просто случайно назначать номер в диапазоне от 0 до 99 например, а дальше при выборке просто генерировать случайное число в этом диапазоне и добавлять по нему $eq условие. это хорошо работает когда документов как минимум на порядок больше чем диапазон если добавить ещё и условие по tags, то тут может возникнуть ситуации, когда оба условия не выполняются. т.е. статьи с тегами есть, а вот с нужным номером нет. можно в приципе попробовать решить через $lt/$gt условие
yopp
но даже с $gt/$lt будет вероятность что в условие ничего не попадёт, хотя документы с нужными тегами есть
Anonymous
а я понял что вы имеете ввиду. согласен
yopp
по этому случайные выборки требуют много вычислений
Anonymous
хм, попал в просак
Anonymous
Зачем вообще рандом?
уникализация контента. есть много видео, и есть много статей - хочу для каждогго видео показывать релевантные статьи
yopp
релеватность не случайный процесс
yopp
это близость ключевых слов
Anonymous
релевантность по тегам
Anonymous
но по тегам там может быть 10000 статей, поэтому разнообразие хотел рандомом
Anonymous
а не одну и ту же показывать под тысячей видео
yopp
не очень дешево, но наверное дешевле чем $sample
yopp
но я не помню, работают ли covered query по массивам
Nick
а не одну и ту же показывать под тысячей видео
Это какойто петпроджект или чтото серьезное?
yopp
в худшем случае 2 запроса
yopp
правда я не уверен в каком порядке вернутся документы в этом случае :)
yopp
в смысле не вернутся, а в каком порядке курсор будет проходить. тут задача поиска ближайшего значения к точке
Николай
Привет, подскажите, пожалуйста. {"ids": {"1": 10, "20": 20}}, {"ids": {"20": 21, "21": 35}}, можно ли как-то посчитать агригацией сумму по ключами объекта поля ids?
yopp
такая схема очень неудобная
yopp
но https://docs.mongodb.com/manual/reference/operator/aggregation/objectToArray/
yopp
хотя на мой взгляд массив документов [{_id: X, value: Z}…] более подходящий вариант,
yopp
так не получилось
а что не получилось?
Николай
не получилось складывать значения через ".k"
Anonymous
Это какойто петпроджект или чтото серьезное?
не совсем ясен контекст вопроса
Nick
не совсем ясен контекст вопроса
Имею ввиду насколько серьезное решение допустимо и как сильно нужно замлрачиваться вам. То что вы описываете надо рассматривать по аналогии с сервисами продажи рекламы и делать сдожное ранжирование, где учитывается частлта пока и релевантность по теме
Anonymous
да любое решение где будет выборка не по 500ms
Anonymous
можно и не замороченное
Nick
Вот и рахговор что надо делать заморочено
Anonymous
элементарный выбор по тегу и рандом это заморочено?
Anonymous
я не слова не говорил про ранжирование, частоту и релевантность
Nick
Ок, пох. Можео добавить простой счетчик пока и показывать самый менее показываемый, а после покаха увеличивать его. В результате вы получите желаемое
Nick
Зато всяко стабильнее рендома
Anonymous
попробую эластиком это сделать. все-таки наверное это задача не для монги
yopp
вы от теоретической части этой проблемы никуда не спрячитесь
Anonymous
там вроде есть нативный апи для рендома, может он эффективнее чем семпл
Al
Всем привет lastEmailSend: [{ action: String, sended: Date }], Как в такой поле вставить объект если объекта с таким action нет и изменить sended если action такой существует?
Al
типа updateOrInsert можно в один запрос?
Al
upsert
типа db.users.updateOne({ _id: ObjectId(id), "lastEmailSend.action": "activate" }, { $set: { lastEmailSend.$.sended: Date.now() }, { upsert: true })
Al
так?
Al
я же обновляю для конкретного юзера?
Al
lastEmailSend вложено в юзера
Dmitry
почему?
А id уже такой был и затем он был удалён? В общем: нужно юзать upsert в данном случае
Al
> db.users.updateOne({{ email: "htchtc052@gmail.com", "lastEmailSend.action": "activate"}, {$set: {lastEmailSend.$.sendedAt: new Date() } }, {upsert: true } }) 2019-11-12T23:20:16.361+0300 E QUERY [js] SyntaxError: invalid property id @(shell):1:20
Al
не робит..
Al
может это тк сам вложенный array еще не создан?