Naniwa
Подскажите, пожалуйста, хотфикс на винду 7 х32. Никак не могу найти(
У меня в каждом документе коллекции хранится uid юзера. Как можно одним запросом сделать обьект юзера встроенным в каждый документ? Гуглю lookup и projection, не совсем то что нужно нахожу
Спасибо, lookup с unwind как раз подойдут, тупанул
Man of Culture
Добрый день
Zloy-Dobry
Man of Culture
ребят, не подскажете, как грамотно сэмплировать выборку из монги? сначала матч поставить, или после сэмплирования? если поставить батч, будет ли пробегаться вся база, или только часть, пока сэмпл на наберется ?
Man of Culture
не гуглится
Man of Culture
(или я не умею гуглить)
Man of Culture
Можете точнее сформулировать задачу, которую хотите решить?
Есть база на несколько Тб, всю ее пробегать 20000 часов, в перспективе то же самое делать с базой на несколько десятков тб, соответственно всю ее пробегать больше суток. По данным из этих баз нужно построить статистику, соответственно хочется взять рандомный сэмпл, но не любых документов, а в которых имеются определенные поля, вот вопрос в том как это сделать по уму, чтобы через всю базу не бегать.
yopp
Какая цель у «рандомного» семпла?
Viktor
Если я правильно понял, то речь идет о репрезентативной выборке
Man of Culture
Какая цель у «рандомного» семпла?
Репрезентативность выборки
Viktor
Значит я правильно понял, тогда нужно смотреть конкретно на данные, распределение значений. Тут скорее вопрос больше в анализе, чем в доступе к данным
yopp
А какой физических смысл данных?
yopp
Какие условия выборки?
yopp
Суть в том, что если есть «определенные поля» как условие, то по ним можно сделать partial index. Но это не даст эффективной случайно выборки. Вообще, её ничего не даст из встроенных инструментов. Это можно решить рандомизируя значение какого-то атрибута в выборке.
yopp
И это аттрибут добавить в этот самый partial index.
Man of Culture
Значит я правильно понял, тогда нужно смотреть конкретно на данные, распределение значений. Тут скорее вопрос больше в анализе, чем в доступе к данным
ну да, у меня задача по анализу, но нужно выборку скачать на локальную машину, чтобы все время к монге не обращаться
Viktor
ну да, у меня задача по анализу, но нужно выборку скачать на локальную машину, чтобы все время к монге не обращаться
товарищ @dd_bb выше подсказал решение, я бы дополнил, что за этот спец атрибут должно отвечать приложение
yopp
Да, конечно. Его должно приложение рандомизировать
Man of Culture
блин, сложно
Man of Culture
но спасибо )
yopp
Какой физический смысл данных?
Viktor
для примера (нерабочий, чисто иллюстрация): делаем эфемерный счетчик до 15, каждая вставка увеличивает шанс, что у документа появится спец. атрибут для выборки, после вставки обнуляем счетчики и начинаем заново
yopp
Ну в теории случайную выборку можно по objectid замутить
Nick
Есть база на несколько Тб, всю ее пробегать 20000 часов, в перспективе то же самое делать с базой на несколько десятков тб, соответственно всю ее пробегать больше суток. По данным из этих баз нужно построить статистику, соответственно хочется взять рандомный сэмпл, но не любых документов, а в которых имеются определенные поля, вот вопрос в том как это сделать по уму, чтобы через всю базу не бегать.
Если у доков ест ьполе с датой и по ней есть индекс, то достаточно делать небольшие выборки внутри каждого дня или даже часа. Это будет достаточно репрезентативно, если сделать выборки условно первых 10 подходящих доков по каждому часу, из них собрать новую базу и по ней уже делать свой подсчет. к тому же такая практика позволит собрать данные за долгую историю и добавлять новые по мере необходисоти
Nick
правда все равно первый этап будет достаточно долгим
yopp
Мы можем долго катать абстрактного коня в условной сфере в идеальном вакууме. :) какой физический смысл данных-то?
Nick
норм катается же))
yopp
Stable: 3.6.2 (Jan 10, 2018), Bugfix: 3.4.12 (Feb 8, 2018) 3.6.2: https://docs.mongodb.com/manual/release-notes/3.6/#january-10-2018 3.4.12: https://docs.mongodb.com/manual/release-notes/3.4/#feb-8-2018 3.2.19: https://docs.mongodb.com/manual/release-notes/3.2/#feb-6-2018
Viktor
До 3.4?😭
До 3.6.4, например)
Viktor
Я мажорной считаю 3.6
yopp
норм катается же))
обычно из такого накатывается что-то очень страшное
Максим
Всем привет! Подскажет в монге при создание запроса можно как то взять значение из текущего документа?
yopp
Что значит «текущего документа»?
Nickolay
Видимо имеется ввиду, когда нужно сравнивать одни поля документа с другими. Например получить все документы у которых одинаковые поля
Максим
который во время поиска монга сравнивает с запросом
Максим
Мне нужно найти документы у которых некое поле ScannedOn былло меньше чем текущее время минус заданный интервал в данном документе
Максим
что то вроде {"ScannedOn" : { "$lte" : new Date((new Date().getTime()/1000-this.Interval*60)*1000) } }
Максим
естественно так не работает
yopp
В запросе это сделать невозможно. И надеюсь никогда и не будет возможно :)
yopp
Это можно сделать в map/reduce
yopp
Но всё это звучит как Очень Плохая Идея™
yopp
Какую проблему вы решаете?
Nick
есть один изврат, но никакие индексы работать не будут, поэтому с осторожностью если данных много https://docs.mongodb.com/manual/reference/operator/query/where/
Максим
т.е строить запросы по коллекции основываясь на данных из документов этой же коллекции противоречит монге?
Максим
вот так { "$where": function() { return this.ScannedOn <= new Date((new Date().getTime()/1000-this.Interval*60)*1000); } } работает
yopp
$where это кастрированный map, это Абсолютно Плохая Идея™
yopp
$where это легкий способ выстрелить себе в коленку так, что ещё и руки оторвёт :(
yopp
я перефразирую свою мысль: если вам так надо выбирать данные, вы вероятно что-то делаете не так
Nick
Я осознаю что плохой совет и про это предупредил, однако иногда приходится и такое делать
Nick
А вот про кастрированный мап спасибо, улучшило понимание
yopp
там ещё есть $expr, который кастрированный AF
Artur
Парни, делаю множественную выборку через db.collection("customers").find({ id: { $in: [ 390, 754, 454 ] } }) у меня в БД предположим есть только id 754, и эта функция вернёт только один объект с этим id. Можно ли заставить его возвращать null или пустой объект, если id нет в базе? Чтобы получить что-то типо этого [ { },{id:754, name: 'blabla'},{ } ] ?
Artur
необходимо обработать исключение если какого-то id нет в базе, а делать одиночную выборку для всех элементов массива слишком затратно
yopp
дешевле всего это потом в приложении сделать
Artur
ну единственный вариант который в голову пришел
Artur
сравнивать входной массив, с ключами возвращенного из БД
yopp
всё именно так
Artur
надеялся что не увидел чего в доке монги)
Artur
спасибо
Максим
тяжело что-то советовать, если не понятно какую проблему вы решаете
Я бы хотеб выбрать из коллекции только те документы у которых значение поля ScannedOn <= (Date.Now - this.interval)
Максим
что тут можно сделать?
yopp
зачем?
yopp
в смысле: какую проблему ты решаешь?
yopp
мне кажется что тебе нужно поменять схему
yopp
(добавив поле NextScanOn)
yopp
которое будет равно ScanedOn + Interval
yopp
и которое будет устанавливаться когда меняется или ScannedOn или Interval
yopp
всё остальное — тлен
yopp
ты вместо двух операций сложения заставляешь базу данных делать 2N операций сложений
Максим
Так и сделаю. Спасибо!