Alexander
Date
Просто Date, не array of Date?
Daniel
Alexander
Очень странно. Я сделал небольшой эксперимент в mongosh
const ts = 1680525820000; // Текущий timestamp
db.coll1.drop();
db.coll1.createIndexes([{intValue: 1}, {dateValue: 1}]);
for (let i = 0; i < 10000; ++i) {
docs.push({intValue: ts+1, dateValue: new Date(ts+i)});
}
db.coll1.insertMany(docs);
Collection size: 147KB, 10000 documents
dateValue_1 size: 102.4KB
intValue_1 size: 86KB
У меня вышло, что одна запись в индексе для Date занимает примерно 10 байт, и для int примерно 8 байт, что вполне ожидаемо.
В вашем случае примерно 303 байта для updatedAt_-1 ((39.2*10^9)/(129*10^6)). Это примерно в 30 раз больше того, что я получил в своем эксперименте
Alexandrr
Alexander
test> a = ISODate()
ISODate("2023-04-03T13:12:10.249Z")
test> new Date()
ISODate("2023-04-03T13:12:15.061Z")
Alexandrr
Hunter
Alexander
sizeof сколько?
Все не так просто. В индексе данные хранятся, предварительно сконвертированные в KeyString:
https://github.com/mongodb/mongo/blob/f7722296ffa2f05b755abc081b59a036db7bbf1f/src/mongo/db/storage/key_string.cpp#L756-L762
Мы видим, что Date() добавляет 9 байт - 1 байт на тип данных + 8 байт на timestamp.
Это для ключа, значение же хранится в RecordId, которое обычно занимает 8 байт.
Но, WiredTiger сжимает данные, поэтому реальный размер меньше.
The end.
Добрый день! Подскажите, пожалуйста на счет установки mongo c++ и C driver. Когда я собираю c driver у меня нету папки lib в которой должен быть файл libmongoc-1.0.lib.
собираю на windows
Alexandrr
Все не так просто. В индексе данные хранятся, предварительно сконвертированные в KeyString:
https://github.com/mongodb/mongo/blob/f7722296ffa2f05b755abc081b59a036db7bbf1f/src/mongo/db/storage/key_string.cpp#L756-L762
Мы видим, что Date() добавляет 9 байт - 1 байт на тип данных + 8 байт на timestamp.
Это для ключа, значение же хранится в RecordId, которое обычно занимает 8 байт.
Но, WiredTiger сжимает данные, поэтому реальный размер меньше.
для сравнения, в python sizeof() для объекта таймштампа в _id возвращает 48 байт, +12 байт согласно доки сам _id ("Returns a new ObjectId. The 12-byte ObjectId consists of:"), итого 60 байт.
при простом подсчёте 129кк (судя по скрину) = 60*129000000/1024/1024/1024 = 7.2 ГБ, это без учёта unicode/decode операций при прохождении через IO.
фактический размер будет гораздо больше.
удивительно, что на скрине 115 ГБ индексы весят.
но если пересчитывать на аверадж документа 129кк * 1.09 / 1024 / 1024 = 134 ГБ
при этом написано storadge_size = 42 ГБ, это как вообще?
ну и если 134 - 42, то ни как не равно 115 ГБ.
получается эта программа, что на скрине нагло врёт про размеры
Alexander
Alexandrr
Alexander
Кстати, при чем тут размер объекта в Python? Данные в MongoDB хранятся в сжатом BSON. Собственно сжатие объясняет путаницу с размерами
Alexander
Alexandrr
теперь понятно почему я привёл в пример именно sizeof() python?...
ну вообщем там на странице гитхаба в сорсе всё расписано если вчитываться
Alexander
Alexandrr
Честно говоря, непонятно при чем тут размер в Python.
проще говоря этот метод делает unicode|decode операции, то же, что и сам snappy, так как исходники одинаковые
на счёт последнего могу ошибаться, потому что давно в плюсы не смотрел последних версий, но вроде не менялось ничего
Alexandrr
вообщем, для 17 индексов криво настроенных, которые используются не по назначению, 115 ГБ это норм
Daniel
Да без индексов
То есть как я понял из вашего диалога
У меня с индексами все в порядке, просто коллекция сжата и весит 40 гигов, а по факту вселила бы намного больше и размер индекса по дате нормальный?
И оптимизировать это дело некуда?
Alexander
Alexander
Попробуйте посмотреть в explain тин индекса, если вы выполните команду вроде
db.productcolors.find({updatedAt: ISODate()}).hint('updatedAt_-1').explain()
IXSCAN stage будет содержать информацию об индексе
stage: 'IXSCAN',
keyPattern: {
updatedAt: -1
},
indexName: 'updatedAt_-1',
isMultiKey: true,
multiKeyPaths: {
updatedAt: [
'updatedAt'
]
},
isUnique: false,
isSparse: false,
isPartial: false,
indexVersion: 2,
direction: 'forward',
indexBounds: {
updatedAt: [
'[new Date(1680541832466), new Date(1680541832466)]'
]
}
Александр
Добрый день, в агрегации перестал работать оператор toString
Александр
$convert тоже не работает, все перепробывал
Александр
Подскажите пожалуйста в чем может быть проблема, версия монгуза "version": "7.0.3",
Александр
Igor
Всем добрый день.
Не сталкивался никто с проблемами сортировки на вьюхах ? Проконсультирует ли кто по особенностям и как решать проблему медленных запросов с сортировкой? Спасибо.
Alexander
Alexander
И если много документов возвращается, то идеально бы использовать covered query, иначе FETCH убьет всю производительность
https://www.mongodb.com/docs/manual/core/query-optimization/#covered-query
Igor
filter:{ <диапазон по date>}, sort:{ "date" : -1 }, limit:50.
Поле разумеется в индексе.
Во вьюхе две коллекции по одинаковой схеме. Я здесь соблюдаю правило ESR.
Запрос чисто на коллекции работает, а на вьюхе над двумя коллекциями тормозит.
Евгений
Привет, народ. Немогу осилить вопрос, помогите.
Мои документы (пример)
{... 'status': 'Отклик', 'id_contact': '111' ...}
{... 'status': 'Анкета', 'id_contact': '111' ...}
{... 'status': 'Отклик', 'id_contact': '222' ...}
{... 'status': 'Анкета', 'id_contact': '222' ...}
{... 'status': 'Анкета', 'id_contact': '222' ...}
Моя группировка
{'$group': {'_id': '$status', 'count': {'$sum': 1}}}
Мой результат
{'_id': 'Отклик', 'count': 2}
{'_id': 'Анкета', 'count': 3}
Но мне нужно посчитать уникальные id_contact в каждой группе. Т.е. я хочу получить такой результат:
{'_id': 'Отклик', 'count': 2}
{'_id': 'Анкета', 'count': 2}
Как подсчитать количество уникальных id_contact в каждой группе?
Alexander
Привет, народ. Немогу осилить вопрос, помогите.
Мои документы (пример)
{... 'status': 'Отклик', 'id_contact': '111' ...}
{... 'status': 'Анкета', 'id_contact': '111' ...}
{... 'status': 'Отклик', 'id_contact': '222' ...}
{... 'status': 'Анкета', 'id_contact': '222' ...}
{... 'status': 'Анкета', 'id_contact': '222' ...}
Моя группировка
{'$group': {'_id': '$status', 'count': {'$sum': 1}}}
Мой результат
{'_id': 'Отклик', 'count': 2}
{'_id': 'Анкета', 'count': 3}
Но мне нужно посчитать уникальные id_contact в каждой группе. Т.е. я хочу получить такой результат:
{'_id': 'Отклик', 'count': 2}
{'_id': 'Анкета', 'count': 2}
Как подсчитать количество уникальных id_contact в каждой группе?
Можно например, оставить только уникальные комбинации status и id_contact сначала, добавив другой $group:
[
{$group: {_id: {status: "$status", id_contact: "$id_contact}},
{$group: {_id: "$_id.status", count: {$sum: 1}}}
]
Евгений
First
привет, подскажите, почему так:
collection
.find(filter)
.sort(sort)
.skip(pageSize * page)
.limit(pageSize)
.iterator()
.forEachRemaining(
на второй и следующих страницах выдает частично одинаковые результаты? фильтр и сортировка не менялись
Alexandrr
First
Alexandrr
нет
что в переменных из текста выше вводится, приведи пример
First
спасибо, сейчас проверю
First
First
коллекция 100% не меняется, сортировку отключал... остался только фильтр видимо
Alexander
Наоборот нужна сортировка которая задаёт total order, иначе порядок документов неопределен. В вашем случае сортировка скорее не по уникальным полям
First
Alexandrr
Alexander
https://medium.com/swlh/mongodb-pagination-fast-consistent-ece2a97070f3
Раздел "Sorting and Tiebreaker"
Alexander
И официальная документация
Using skip() with sort()
If using
skip()
with sort(), be sure to include at least one field in your sort that contains unique values, before passing results to
skip().
Sorting on fields that contain duplicate values may return an inconsistent sort order for those duplicate fields over multiple executions, especially when the collection is actively receiving writes.
The easiest way to guarantee sort consistency is to include the _id field in your sort query.
See Consistent sorting with the sort() method for more information.
https://www.mongodb.com/docs/manual/reference/method/cursor.skip/#using-skip---with-sort--
First
спасиб, буду читать)
Alexandrr
я не имел ввиду код, я имел ввиду конечное выражение mongodb, нужно понимать ты осуществляешь:
- поиск текста по строкам, строка фильтра = искомой строке
- полнотекстовый поиск
- поиск с помощью регулярных выражений
- поиск строки в bytes зашифрованной алгоритмами типа AES
но выше тебе правильный ответ дал Александр
First
разобрался, всем спасибо:)
First
а кто-нибудь подскажет могу я использовать один объект BSON для фильтра в многопотоке? или на каждый запрос нужен свой объект?
Nick
First
First
Nick
прорабатывают логику изменения данных с учетом требований и возможностей бд. например берут транзакции и не думают об этом
Nick
если что в монге тразакции уже тыщу лет как есть
Nick
https://www.mongodb.com/docs/manual/core/transactions/
Nick
не менее увлекательное чтиво https://www.mongodb.com/docs/manual/indexes/
Nick
если у вас какойто конкретный вопрос, то задавайте, по общим вопросам слишком много текста выдат ьпридется
Vlad Dubok
Подскажите плиз как решить задачу. У меня есть коллекция А в которой есть массив B в котором есть массив С. В последнем есть поле EndDate она же дата. Мне нужно достать всю коллекцию, но при этом отфильтровать ее так чтобы в массиве С остались только те документы которые EndDate > Datetime().
Я начал делать через агрегацию:
Сначала откинул все елементы которые не имеют нужной даты
{
$match: {
"B.C.EndDate": { $gte: new Date("2023-01-01") }
}
},
Vlad Dubok
дальше пытаюсь делать следущее
{
$project:{
B: {
C: {
$filter: {
input: "$B.C",
as: "task",
cond:{
$gte: ["$$task.EndDate", new Date("2021-01-01")]
}
}
}
}
}
},
Vlad Dubok
Сейчас возвращаються пустые С без какой либо инфы
ᅠIgor
Всем привет.
Если я хочу сделать приложение, чтобы пользователи могли загружать картинки (разные пользователи - разное кол-во картинок), подойдёт ли мне для этого mongo?
Ivan
ᅠIgor
А может подскажите, где можно именно картинки хранить?
ᅠIgor
Думал может есть сервис какой то для хранения такого рода файлов
ᅠIgor
Это понятно
ᅠIgor
Буду разбираться, спасибо
Alexandrr
ᅠIgor
Алексей
Всем привет) А используюя .populate() можно делать какую то выборку по полям?
К примеру есть схема поста которая ссылается на схему юзера, как сделать так что бы тянулись не все данные юзера а несколько полей?
Alexander
Алексей