
Геннадий
25.07.2018
13:21:16
Псевдо, потому что внутри motor создаёт пул тредов для запуска соединений с mongodb, а треды - это не асинхронность. В каждом треде живёт одно соединение. Асинхронного драйвера для mongodb в питоне нет.
Кстати, если кому интересно. Раскопал драйвер для python, вроде асинхронный по-настоящему: https://github.com/ZeoAlliance/aiomongo. Внутри посмотрел асинхронное соединение прямо с сервером и никаких тредов. Пишут, что сильно производительнее motor. Но его, особо никто не использует почему-то. И вялый проект какой-то. Странно...

AstraSerg
25.07.2018
14:10:07

Геннадий
25.07.2018
14:10:41
Я тоже потестирую на досуге... По фичам вроде всё основное есть.

Google

AstraSerg
25.07.2018
14:11:29
только вот Python 3.5.2 or later нужен. Не у всех есть...

Peter
26.07.2018
07:50:05
Как можно понять, был ли документ изменен, добавлен, или документ вообще не изменялся при update?

AstraSerg
26.07.2018
07:50:53

Peter
26.07.2018
07:52:06
но как я понимаю, если даже документ существует и в нем ничего не было изменено, он всеравно возвращает что документ изменен?

AstraSerg
26.07.2018
07:52:47
вот пример:
rs0:PRIMARY> db.stat_tmp.update({status: 8}, {x: 1})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })

Peter
26.07.2018
08:08:00
а у меня возвращает nModified: 1 даже если документ совпадает

AstraSerg
26.07.2018
08:30:28

Peter
26.07.2018
08:30:57
тип?
да нет, один и тот же код испольняю через nodejs, один и тот же обьект

AstraSerg
26.07.2018
08:31:44

Peter
26.07.2018
08:40:26
?♂️ сори, туплю, у меня там Date.now() в документе)

Google

AstraSerg
26.07.2018
08:41:00

Anton
26.07.2018
12:07:35
Привет всем!
Есть такой запрос http://dpaste.com/1K8VY4D . Он находит дату первого заказа для каждого пользователя. Теперь мне надо выбрать из заказов данные { id, is_first_order }. Это по сути $lookup, только для уже выбранных данных. Подскажите, как это сделать..

AstraSerg
26.07.2018
12:44:35

Anton
26.07.2018
12:46:14
Там привязываются другие таблицы, а у меня вроде подзапрос.

AstraSerg
26.07.2018
12:47:53

Anton
26.07.2018
12:53:21
или в своем случае я могу сделать привязку 2 раза к таблицы orders, а потом просто сгруппировать нужные данные..

AstraSerg
26.07.2018
12:54:16

Anton
26.07.2018
13:00:01
Что-то вроде того - http://dpaste.com/2J91FZ5 и результат http://dpaste.com/2HKFD7A
Не знаю оптимально ли это, но тут по сути 2 запроса всего

AstraSerg
26.07.2018
13:01:36

Anton
26.07.2018
13:02:03
Спасибо за наводку)
пару часов просидел, думая

AstraSerg
26.07.2018
13:02:14

Anton
26.07.2018
13:02:26
1000 где-то

AstraSerg
26.07.2018
13:02:37
1000 где-то
1000 оно в памяти держать может даже без индексов

Anton
26.07.2018
13:03:55
В конце еще добавлю { $group: { _id: { month: { $month: '$date_created', year: { $year: '$date_created' } } } и будет видна статистика returned и onetime покупателей по каждому месяцу

AstraSerg
26.07.2018
13:04:36

Anton
26.07.2018
13:05:16
с монго раньше не работал просто

Google

AstraSerg
26.07.2018
13:06:17

Anton
26.07.2018
14:52:37
Привет всем, такой вопрос, насколько функция remove быстрая?
Просто получается такая ситуация, что у меня есть функция, которая запускает кроном каждые 5 минут:
1) достает из базы все данные
2)ремувит данные в таблице с помощью remove
3)меняет достаные данные чутка относительно новой инфы
4)инсертит эти же данные в таблицу
Я начал замечать, что информации в таблице очень мало и как-то не так работает инсерт
но еще позже увидел, что иногда ремув срабаывает позже инсерта(хотя все должно быть наоборот)(по логам)
причем может быть раз в 10 минут, а может раз в 100 минут

Yurii
26.07.2018
14:54:00

Anton
26.07.2018
14:54:07
Видимо самым простым вариантом будет делать инсерт после кэлбэка ремува
удалить данные раньше

Yurii
26.07.2018
14:57:53
удалить данные раньше
а у тебя они пересекаются? сделай unique индекс, пока данные есть он ещё раз их не вставит, потом удалит по индексу и ты вставишь

AstraSerg
26.07.2018
14:59:34

Anton
26.07.2018
15:00:36
да, они считай самазаменяющиеся, просто каждый вызов функции добавляет данные из сторонней апихи, но в будущем в базе будет столько записей, что проще достать их из базы, фором добавить в массив один объект и сделать insertMany

M
26.07.2018
15:00:42
ребят а тут говорили что в монго правильно настроить шардинг как можно раньше но там какие то проблемы с бекапами и управлением
можете просветить?

Anton
26.07.2018
15:00:46
А на сколько плох вариант с инсертом после каллбэка ремова
?

AstraSerg
26.07.2018
15:02:08

Anton
26.07.2018
15:03:36
увы, но пока что нет, если же монга допилит массовый апдейт в бд с разными данными(а не то, как это есть сейчас, где на разные записи в таблице по сути можно только статус поменять один и тот же)
потому что получается так, что у меня у каждой записи есть массив и в этот массив каждые 5 минут надо добавлять новый объект
и потенциально таких записей может быть 1000-5000
и делать апдейт каждые 5 минут на столько записей весьма хардкорно по производительности

Google

AstraSerg
26.07.2018
15:04:40

Anton
26.07.2018
15:05:17
ну, я пошел тут из принципа меньшего количества запросов к бд)
Старая привычка от ментора)

AstraSerg
26.07.2018
15:06:36

Anton
26.07.2018
15:06:55
по крайне мере пока что нет)
так как там полностью разные объекты
относительно каждой записи
если бы они были одинаковые, то да, updateMany и вперед
я так со статусами делаю, просто массив айдишников
и in

AstraSerg
26.07.2018
15:08:40
как альтернативу вы хотите сделать один файнд всего, изменение в апликации, ремув всего и инсерт изменённых данных. Верно я понимю?

Anton
26.07.2018
15:10:02
ну как самый сбалансированный вариант в моей ситуации(по моему мнению) - это достать все записи из базы, ремувнуть таблицу, допилить это данные как мне нужно и заинсертить опять в базу
оно так и работает уже отсноительно долго
но только сейчас я заметил
что данные не накапливаются
а потом логами заметил фичу, что ремув иногда(без особой логики) срабатывает после инсерта
а не до, как это прописано кодом
хотфиксом сейчас решил эту проблему вызово инсерта от resolve ремува

AstraSerg
26.07.2018
15:11:41

Anton
26.07.2018
15:12:25
почему? я делаю 3 запрос за 5 минут, вместо n запросов относительно количество данных в базе

Google

AstraSerg
26.07.2018
15:13:59
> делаю 3 запроса
относительно файнд и ремув - согласен, а вот инсерт множества документов, чет сомнения меня гнетут...

Anton
26.07.2018
15:15:15
ну дык insertMany же по сути один запрос идет
нет?
просто пихаю массив с кучей объектов
один раз

AstraSerg
26.07.2018
15:16:50

Anton
26.07.2018
15:17:37
возможно так и есть, но ведь есть делать просто update, то это каждый раз новое соединение, нет?
я думаю есть разница между тем, как постучать в дверь и отдать сразу коробку писем
или же стучаться каждый раз давая новое письмо)

AstraSerg
26.07.2018
15:18:43

Anton
26.07.2018
15:21:49
тогда(чисто теоретически) это получается тот же самый апдейт(но мы этого не узнаем), но с чутка меньшим количеством кода
монга конечно приятнее sql(имхо), но подставить тоже умеет)

AstraSerg
26.07.2018
15:51:41

Anton
26.07.2018
15:52:38
ну вот из бд, я сначала весьма долго был на монге
и вот только не так давно попробовал sql
поначалу было дико больно
но потом привык
но все равно монго ван лав

AstraSerg
26.07.2018
15:56:08

yopp
26.07.2018
15:56:25

Anton
26.07.2018
15:56:28
ну, считай я в целом с бд познакомился именно на монге)