pplcf
это будет выглядеть очень странно
pplcf
это делается стандартными средствами как и во всем вебе
pplcf
делаешь просто сессии для юзеров
pplcf
новая инвалидирует старую
Nick
Стойкое ощущение, что вы пилите велосипед
Nick
Я бы предложил залететь в чат котлина и спросить как жить с вс сессиями на кторе
Nick
Думаю там предметно подскажут
pplcf
ну, при создании новой сессии пытайся дисконнектнуть все старые
Nick
Вы забываете что у вас один инстанс планируется, а всякие базы нужны когда их будет больше одного
pplcf
мне кажется ты сам задачу странно видишь
pplcf
тебе просто нужно убрать канкаренси в рамках одного юзера?
pplcf
игру делаешь?
pplcf
это делается сессиями
pplcf
нет разницы каким транспортом приезжает сообщение
pplcf
вебсокет, голый TCP или HTTP
pplcf
у тебя есть API и к нему ты делаешь сессии
pplcf
новая всегда инвалидирует старую
pplcf
даже если старый коннект как-то выживет, он со старым ключем ничего не сможет сделать
pplcf
там же ему можно выдать сообщение что он уже протух
pplcf
и дисконнекнуть
pplcf
плюс во время создания сессии можно пытаться убить все старые коннекты
pplcf
ну это странная механика, очень много проблем будет
Nick
Это плохо, будут большие проблемы с юзерами у которых чтото повисло
pplcf
делай как айтюнс, так делают все
pplcf
и делают так не зря
Nick
Т.е. У вас на серваке по каждому коннекту будет таймер?
Nick
Не расчитывайте что ос за вас чтото закроет
Nick
И так же не думайте что она сразу сообщит если коннект повис, помер маршрут и.т.п
Nick
зачем? вамнужны сессии, мехнаиз работы с ссессиями как внутри одного инстанса так и в распределнной структуре перепахан вдоль и поперек
Nick
просто разберитесь что они предлагают и примените это к своему случаю
Nick
@dd_bb
Nick
https://hackernoon.com/enforcing-a-single-web-socket-connection-per-user-with-node-js-socket-io-and-redis-65f9eb57f66a
Nick
первая ссылка
Nick
или вторая
Nick
соотвественно вместо ноды - ктор, вместо редиса - внутренняя инмемори синхронизируемая мапа
Nick
так а вам то зачем редис? вам просто нужно хранить мапу коннектов и просто синхронизировать доступ записи о коннекте. в жаве так вообще есть амечателный putIfAbsent метод на мапах, который вернет предыдущее значение если оно было при это не перезаписав мапу
Nick
еще раз - в пределах одного инстанса вам не нужны распределенные механизмы и можно обходитсья дешевыми средствами, котоыре просто живут в том же приложении
Nick
конкретно по применимости редиса в той статье - нода изначально предполагает инстанс/ядро и если нужно утилизировать больше ядра, то тут уже больше одного инстанса и получаем реальную необходимость в редисе
Artem
У меня есть документ
{
'_id': 'sax342-cac44333fr-dadad4r4d'
'name': 'text',
'statistics': [
{'id', 'test_1', total: 0}
]
}
Мне нужно в один запрос добавлять в statistics новый элемент массива {id: 'test_2', total: 0},
а если он существует то попросту инкриментить total, можете подсказать как это можно сделать
yopp
yopp
ещё есть вариант заменить массив на документ, но в этом случае потеряется возможность индексировать по statistics.id и придётся ещё раз дублировать id, например в массиве
Artem
@dd_bb спасибо
yopp
yopp
и $inc: {"stats.ABC1": 1}, $addToSet: { "stats_ids: ""ABC1" }
yopp
если ключа нет, $inc его создаст
yopp
addToSet поможет избежать дублирования записей в stats_ids
Nick
Nick
вообще получилась такая срань в два запроса на текущей структуре:
1) добавляет запись в массив с тоталом если нет записи с таким id в массиве
db.getCollection('tst').update({
_id: 'sax342-cac44333fr-dadad4r4d',
"statistics.id": {$ne :'test_2'}
}, {
$push: {
"statistics": {
"id":"test_2",
"total": 0
}
}
})
2) инкремент, к этому моменту в массиве либо добавлен наш новый объект с тотал 0, либо остался предыдущий
db.getCollection('tst').update({
_id: 'sax342-cac44333fr-dadad4r4d',
"statistics.id": 'test_2'
}, {
$inc: {
"statistics.$[el].total": 1
}
}, {
arrayFilters: [{
"el.id": "test_2"
}
]
})
тотал нулем выставляем, чтобы потом инкремент его увтановил в значение инкремента
yopp
это не срань, это нормально
Nick
если допустимо считать что тотал=0 не возникает никогда в обычной работе, то оно даже переживет падение между двух операций
Nick
к сожалению пытался на arrayFilters заделать, но все упирается в изменение одного и того же поля
yopp
да, даже помоему был где-то тикет
yopp
но тут появляется условность и атомарность уже вероятно логически нельзя гарантировать
yopp
но это pure speculation
Artem
Спасибо
Artem
большое
Maxim
Как добавить новый embedded документ в массив?
Maxim
У меня всё разбивается на объекты
yopp
объект и есть документ
Maxim
Maxim
Как получить индекс документа в массиве?
Nick
зачем?
Maxim
зачем?
Есть такая возможность? Добавляю новые документы с помощью $push, хочу использовать индекс в качестве id
Nick
есть, только больно
Nick
проще вытащить док и в приложении найти то что вам надо
Nick
я не знаю вашу задачу и не представляю что мжет быть "лучше"
Nick
поэтмоу и спрашивю зачем оно вам надо?
Nick
может вам и массивы не нужны
Maxim
yopp
вот разбор похожей задачи на примере комментариев
https://docs.mongodb.com/ecosystem/use-cases/storing-comments/
Phantom
всем привет.кто нить знает почему на 97 строке возвращается промис? в доке написано, что метод возвращает количество документов. мне нужно проверить является ли пользователь первым, кто регается, и если да, то добавить его в коллекцию.иначе чекать уникальный ли username...но когда я регаю первого польщователя, я попадаю внутрь блока на 96 строке, кто нить сталкивался с подобным?
Maxim
Как поменять поле done? Пытаюсь через
def finish_task(user_id, task):
db.users.update_one({'user': user_id, 'tasks': {'task': task}},
{'$set': {'tasks.done': True}})
Не выходит
Nick
Nick
Nick
и советую не придумывать свои форматы для хранения дат/времени, используйте встроенные механизмы
Denys
всем доброго времени суток, может кто подскажет хороший онлайн курс по монгодб?) ищу на udemy, так там в основновном вместе с нодой, хотелось подробно монгодб разобрать
Maxim