Nick
это врапер над агрегацией
critskiy
йап…
Georgii
Привет!
Я ньюфаг, прошу помощи.
у меня есть коллекция tours, один элемент выглядит примерно так:
{
id: ...,
schedule: [{kind: 'GroupAction'}, {kind: 'GroupAction'}],
...
}
Их много. В каждом tour в schedule мне нужно переименовать поле kind в каждом элементе.
Я пишу команду:
db.getCollection('tours').update({'schedule.kind': 'GroupAction' }, { $set: { 'schedule.$.kind'
: 'action' } }, { multi: true });
Он мне отвечает:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
В итоге в каждом tour.schedule переименовал kind только в первом элементе. Приходится запускать команду несколько раз, чтобы все переименовал.
Что я делаю не так?
Nick
Привет!
Я ньюфаг, прошу помощи.
у меня есть коллекция tours, один элемент выглядит примерно так:
{
id: ...,
schedule: [{kind: 'GroupAction'}, {kind: 'GroupAction'}],
...
}
Их много. В каждом tour в schedule мне нужно переименовать поле kind в каждом элементе.
Я пишу команду:
db.getCollection('tours').update({'schedule.kind': 'GroupAction' }, { $set: { 'schedule.$.kind'
: 'action' } }, { multi: true });
Он мне отвечает:
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
В итоге в каждом tour.schedule переименовал kind только в первом элементе. Приходится запускать команду несколько раз, чтобы все переименовал.
Что я делаю не так?
https://docs.mongodb.com/v4.0/reference/operator/update/positional-all/#update-all-documents-in-an-array
Georgii
Алишер Абдуллаев
ребята , можете подсказать пожалуйста , нужно по интервалу 30мин получить данные в период с началы дня до данного времени. Как сделать подскажиет пожалуйста ?
Dmitriy
Алишер Абдуллаев
Спасибо за ответ. Например, есть данные звонка за день(исходящий, входящий и тд). Мне нужно посчитать за день по интервалу 30мин сколько количество входящих, исходящих и тд были
Алишер Абдуллаев
from 00:00am till now
Dmitriy
да, я понял о чем вы, я свое время такую задачу решал через aggregate вида:
[
{$match: {}},
{
$project: {
"period_in_day": {$cond: [
{ $and: [{$gte: ["$hour", 0]}, {$lte: ["$hour", 7]}] }, "00-07",
{$cond: [{$and: [{$gte: ["$hour", 8]}, {$lte: ["$hour", 15]}]}, "08-15", "16-23"]}
]}
}
}
]
соответственно в $match у вас идет ограничение по времени, а в "period_in_day" вам надо сделать cond-ы по всем временным интервалам, которые вам нужны, т.е. по минутам (секундам), начиная с 0 часов
ну а дальше следующим стейджем вы можете группировку получить по периодам внутри временного отрезка
мой код выше - это чисто пример как я делал, возможно есть варианты оптимальней, но я не нашел их в свое время
Алишер Абдуллаев
да об этом думал, но есть наверно , которые сталкнулись и более оптимальные варианты. Спасибо Дмитрий!
madspectator
В агрегации разве нет функции типа strftime, чтобы просто использовать параметр "%H:%M" и затем группировать по этому результату?
Dee
Всем привет! Подскажите по best practise
Есть документ, например Account. Генерим UUID программно хотим сохранить его в наш документ. Этот UUID - идентификатор данного документа.
Для этого:
1) Используем _id поле монги и сетим туда сгенерированный UUID
2) добавляем поле accountId и сетим туда сгенерированный UUID
Как более правильно и почему?
yopp
yopp
yopp
чем oid не подходит?
madspectator
Dee
а почему именно uuid?
Тут не важно, что именно. Это может быть и нумерация. Просто вопрос, куда правильнее сохранять.
в отдельное поле или можно в _id
yopp
правильно или не правильно тут нет
Dee
Я понял вопрос.
Dee
UUID, потому что он будет использоваться ДО создания в базе.
yopp
objectid так-же можно генерировать на клиенте
yopp
более того, многие odm по-умолчанию и генерируют его на клиенте
yopp
вводить отдельное поле имеет ссмысл если документ имеет какой-то ещё идетификатор, специфический для внешней системы
yopp
в остальных случаях я не вижу смысла вообще трогать _id
yopp
yopp
не понял вопрос
Dee
yopp
в 99.7% ни в каких
yopp
оставить oid и всё
Dmitriy
Можно ли с клиента сохранить в поле _id не hex, а uuid?)
Dee
Dee
Я топил за то, чтобы этот идентификатор пихать в _id (как в SQL например), но коллеги считают, что надо дополнительное поле.
yopp
yopp
т.е. в чём проблема с oid?
Dmitriy
Bat
yopp
Его можно трогать, когда этому есть рациональное объяснение
yopp
это 0.3% случаев, когда есть конкретная проблема, которая не решается использованием oid
yopp
и из этих 0.3% больше половины будут оптимизации
Dee
yopp
т.е. когда мы можем вместо псевдослучайного значения положить в индекс что-то immutable и что даст какие-то очевидные приемущества
yopp
почему он не используется-то? :)
Dee
Я и пытаюсь этьо объяснить.
yopp
проблема что у вас идентификатор генерируется на клиенте не является проблемой, так как ObjectId тоже так умеет
Dee
Да, когда я это прочитал, подумал, что может быть решением.
yopp
разница между uuid/v4 и objectid только в структуре
Dee
Но коллегам не нравится, что мы используем для внешних систем _id который завязан на базе данных, а не какое-то кастомное поле, которое создали мы.
yopp
а смысл у них примерно одинаковый, это два псевдослучайных идентификатора
yopp
«не нравится» неэффективно
yopp
если «не нравится» нет рационального, аргументированного объяснения, то самая эффективная стратегия игнорировать тех кому не нравится и оставить по-умолчанию
yopp
говоря проще «не нравится» не решает конкретной проблем. а раз проблемы нет, значит и делать ничего не надо
yopp
а даже если в эти аргументы ввязываться, то uuid и oid одинаково плохой выбор :)
yopp
это всё про «красивые идентификаторы», которые не нужны
yopp
вообще никому
Dee
Dee
=)
Nick
madspectator
Я тоже эмпирическим путём пришёл к тому, что _id лучше не трогать.
madspectator
Думаю, зависит от контекста.
Dee
Какие вообще кейсы у вас для применения _id. Как идентификатор документа или поле для хранения времени создания.
Dee
yopp
yopp
это единственный валидный кейс
Dee
И нет таких кейсов, что вам надо сделать уникальным документ, но ориентироваться на _id не хочется?
yopp
yopp
смысл _id что это контекстно-независимый immutable идетинификатор
madspectator
это единственный валидный кейс
Например, можно грохнуть записи старше какого-то периода времени, имея один лишь _id. Пример, скорее надуманный, но сработает в случае надобности.
yopp
yopp
yopp
если документы как-то привязаны к датам, то в них стоит добавить поля с нужными датами
yopp
oid не гарантирует вообще ничего
yopp
там вместо времени может быть абсолютно что угодно