Ilya
ну надо копать тогда файрвол наверное, чтобы разрешить подключение на монговский порт
Alexey
Да. Буду копать. Спасибо за помощь)
Alexey
Капец. Даже отключение фаервола не помогло
Андрей
Как сделать что бы модель не просто пропускала параметр которого нет в схеме, а реагировала как то на него, например когда добавляю документ?
Андрей
yopp
Привет!
Я пытался разобраться с предлагаемой вами схемой и немного запутался (в том числе ознакомился с ссылками, которвые вы давали). Сразу извиняюсь за глупые вопросы (я дизайнер). У меня получается примерно такой код, но он не работает. Скажите, я в правильном направлении думаю?
exports.weeklySummary = function(cb) {
db.get().collection(config.collectionConnect).aggregate([
{ $project:
{
_id: "$_id",
address: { _id: "$_id", City: "$City", Street: "$Street"},
attributes: { _id: "$_id", Temperature: "$Temperature", Pressure: "$Pressure"}
}
},
{ $group:
{
_id: "$_id",
// date: Date(),
address_id: { "$_id": "$address" },
attribute_id: { "$_id": "$attributes" },
measurements:
[
{
date: "$Date",
value1: "$Temperature",
value2: "$Pressure"
}
],
min: { $min: "$value1", $min: "$value2" },
max: { $max: "$value1", $max: "$value2" },
// count: { $count: "$measurements" }
// sum: {},
// avg: {}
}
}
]).next(function(err, doc) {
cb(err, doc);
});
};
А бросьте пример на play.db-ai.co
Nick
Artem
У меня вопрос в документе есть массив объектов, и нужно что бы в этом масиве были только объекты с уникальными id, как такое можно сделать на уровне схемы валидации,
Мне ясно как сделать что бы элементы масива были уникальны, а как что бы в массиве были объекты с определенным уникальным полем
Artem
?
Nick
Artem
массив объектов к примеру {id: 232, name: '32323'} .... и в массиве id должно быть уникально
yopp
yopp
но вообще я имел ввиду не делать группировки, а сразу сделать документ вида
yopp
{_id: …, location: aaa, attribute: bbb, start_time: time1, end_time: time2, values: [{time: zzz, value: yyy} … ], min:, max:, avg: }
yopp
или вы хотите существующие документы сконвертировать в новый формат?
Semeon
Начал думать, пытаться накидывать варианты, но ничего особо не вышло. Решил вернуться к вам за уточнением.
Nick
yopp
yopp
в вашем примере у вас на каждое значение по одному документу, что для временных рядов очень не эффективно
Semeon
пока вы далеко не уехали я вам рекомендую поменять схему. группируйте ваши значения в один документ на час
{
_id: <ObjectID>,
date: Date("округлить до начала часа"),
address_id: <ObjectID>, // из коллекции addresses, где уже {_id:, Street:, Address:}
attribute_id: <ObjectID>, // из коллекции attributes, где {_id, type: "Temperature"}
measurements: [
{
date: Date("реальная дата"),
value: <значение>
}
],
min: <минимальное_значение>,
max: <максимальное_значени>,
count: <количество записей в measurements>,
sum: <сумма value из measurements>,
avg: <$div: [$sum, $count]
}
Например, вы пишите <ObjectID>, // из коллекции addresses. Это значит, что мне нужно заранее сгруппировать коллекцию addresses или же речь идёт о коллекции, которая лежит отдельно в базе?
Semeon
Я понимаю, вопросы нубские ) Извините
yopp
речь об отдельной коллекции, да
yopp
у вас там есть city и street
Semeon
Но у меня всё пишется в одну коллекцию и она имеет такой вид документа:
{
"_id": "5da9fa2ef1c2fd2070d320fe",
"Date": 1571431517,
"City": "City",
"Street": "Street",
"Temperature": 25.5,
"Pressure": 748.8
}
yopp
вам нужно сделать из этого коллекцию locations/addresses, где хранить пары City:, Street:
yopp
Semeon
Вот этого и нужно избегать
Кажется, это немного сложно для меня сейчас по ряду причин. Я могу как-то с такой структурой документа получать данные о минимальных и максимальных значениях за всё время?
Semeon
Готов пожертвовать ресурсами, конечно
Semeon
Semeon
Nick
эт тестовые данные какие были
yopp
locations:
{
_id: ObjectId('5def92f98628ea5b7fe83440'),
city: "Moscow",
street: "Leninsky avenue"
}
attributes:
{
_id: ObjectId('5def93218628ea5b7fe83441'),
name: "Pressure"
}
{
_id: ObjectId('5def93218628ea5b7fe83442'),
name: "Temperature"
}
values:
{
_id: ObjectId('5def93368628ea5b7fe83443'),
attribute: ObjectId('5def93218628ea5b7fe83441')
location: ObjectId('5def92f98628ea5b7fe83440'),
start_time: DateTime("2019-01-01T00:00:00"),
end_time: DateTime("2019-01-01T23:59:59"),
count: 2,
values: [
{time: DateTime("2019-01-01T11:00:01"), value: 7.4},
{time: DateTime("2019-01-01T12:00:05"), value: 7.0}
],
min: 7.0,
max: 7.4
}
yopp
вот что я имел ввиду
yopp
документы в values добавляются через upsert по attribute, location и start_time
yopp
там всё достаточно просто, это один $push в values и $min, $max в min и max
Semeon
Так, мне это надо осознать )
Semeon
Вернусь чуть позже
yopp
т.е. вы группируете значения одного аттрибута (температуры, давления) по одному адресу за какое-то время
yopp
если у вас значения собираются с равным интервалом, то вообще отлично
Semeon
Раз в минуту
Semeon
Микроконтроллер опрашивает датчики и отправляет их на сервер
yopp
1440 значения в сутки
yopp
в принципе можно в одном документе хранить сутки
Semeon
Я хочу две ручки сделать: сутки и неделя
yopp
лучше не надо
yopp
сутки
yopp
не вписывайтесь в понятие «неделя», это ОЧЕНЬ сложно
yopp
сутки тоже сложно, но попроще :)
yopp
если есть часовые пояса, то лучше тогда по часу группировать
critskiy
Есть тупой вопрос, очееееень тупой вопрос: as far as I understand операция findAndModify является атомарной операцией, накладывающей оптимистичный лок на документ, с которым она работает, ведь так? (поправьте меня если это не так, возможно, я снова протупилось по месту в документации)
А если допустить, что findAndModify производится последовательно по одной коллекции, то выгоднее ли будет в данном случае использовать update?
Просто сталкиваюсь порой с ситуацией вот такого. рода: по system.profile данная операция порой проседает, потому что производится по нескольку раз.
yopp
yopp
Они работают одинаково
yopp
https://docs.mongodb.com/manual/reference/command/findAndModify/#comparisons-with-the-update-method
Semeon
т.е. вы группируете значения одного аттрибута (температуры, давления) по одному адресу за какое-то время
Я правильно понимаю, что я смогу получить на выходе примерно такую структуру?
{
"LastUpdate": 1571438855,
"Temperature": {
"Min": [
25.4,
1571438855
],
"Max": [
30.1,
1571438855
],
"Avg": 27.3
},
"Pressure": {
"Min": [
748.6,
1571438855
],
"Max": [
749.4,
1571438855
],
"Avg": 749
}
}
yopp
Разница только в том, что update умеет в multi, не умеет в сортировку и не возвращает обновлённый документ
critskiy
critskiy
спс
yopp
Тогда в чём вопрос?
critskiy
может ли один тот же findAndModify, выполненный за короткий промежуток времени несколько раз, вызвать лок на базу/коллекцию в конце концов, хоть и в курсе, что лок у него оптимистичен?
Андрей
Есть бесплатные приложения для визуального проектирования БД? С первого раза не нагуглилось.
critskiy
Потому, что например по slowlogs и по логам базы иногда просачивается вот такое: происходит findAndModify на коллекцию, и следующие за ним findAndModify оказываются залочены им (якобы), но ранее операций, который могут накладывать лок на уровне базы/коллекции нет попросту.
yopp
yopp
critskiy
Залочены это вы как определили?
locks.timeAcquiringMicros, - ведь это поле в system.profile, которое говорит о том, что столько времени данная операция ждала, am I right:
Cumulative time in microseconds that the operation had to wait to acquire the locks
Ну например, выполняется findAndModify 529ms, из них 528ms явно видно по слоулогам, что был лок...?
Поправьте, если это не так.)
yopp
Так, теперь ваш вопрос начинает проясняться
yopp
Другие запросы в это время ждут лока?
critskiy
да
yopp
Что с write/read queue в этой точке?
yopp
yopp
Рекомендую начать с наиболее очевидной теории: у вас что-то в этот момент происходит и просто не хватает ресурсов на выполнение всей очереди
yopp
Посмотрите на io в этот временной промежуток
yopp
И на qps
yopp
И на селективность запросов
yopp
scanned/returned