Нуриддин
А как на них смотреть?
Алексей
ну у монги есть логи, лежат как в конфиге указано, а еще у линукса есть логи, а еще можно перед запуском подключиться к ноде и посмотреть что там с ресурсами под нагрузко
Нуриддин
Линкс логи в порядке
Нуриддин
У монги ещё не смотрел
Vista
Help Me!!!
Алексей
я просто тестирую свой апп тоже под нагрузкой и 1 гиг оперативы всего занято, 4 ядра правда
Ilya
Всем привет. Допустим, у меня есть коллекция users. Допустим, в документе user содержаться поля типо name, city, email, age... и.т.д.
И допустим, что пользователь может запрашивать users с различными фильтрами поиска.
Вопрос - какие под это всё дело строить индексы?
Насколько я знаю, при построении составного индекса порядок имеет значение. А так же имеет значение сортировка.
Это значит, что индекс {name: -1} != {name: 1}. А так же индекс {name: 1, city: 1} != {city: 1, name: 1}. А ведь пользователь может запрашивать users с абсолютно разными комбинациями доступных фильтров, и это естественно.
И я вот представляю, какое кол-во комбинаций потенциально возможных индексов может быть для одного простого, по сути, тривиального запроса с фильтром просто по 4 полям, и понимаю, что тут что-то не так.
Как быть?
Алексей
а сколько документов планируется в юзерс, полей именно столько?
Nick
Всем привет. Допустим, у меня есть коллекция users. Допустим, в документе user содержаться поля типо name, city, email, age... и.т.д.
И допустим, что пользователь может запрашивать users с различными фильтрами поиска.
Вопрос - какие под это всё дело строить индексы?
Насколько я знаю, при построении составного индекса порядок имеет значение. А так же имеет значение сортировка.
Это значит, что индекс {name: -1} != {name: 1}. А так же индекс {name: 1, city: 1} != {city: 1, name: 1}. А ведь пользователь может запрашивать users с абсолютно разными комбинациями доступных фильтров, и это естественно.
И я вот представляю, какое кол-во комбинаций потенциально возможных индексов может быть для одного простого, по сути, тривиального запроса с фильтром просто по 4 полям, и понимаю, что тут что-то не так.
Как быть?
на самом деле достаточно по одному индексу на поле, а монга сама выберет лучший и по нему отфильтрует. Остальное уже чтением с диска. Чтобы это быстро работало закидываете побольше оперативы, чтобы все индексы помещались
Ilya
на самом деле достаточно по одному индексу на поле, а монга сама выберет лучший и по нему отфильтрует. Остальное уже чтением с диска. Чтобы это быстро работало закидываете побольше оперативы, чтобы все индексы помещались
То есть достаточно построить просто индекс {name: 1, city: 1, age: 1, email: 1}, и любой запрос, использующий эти 4 поля в любых комбинациях, будет использовать эффективно этот индекс?
И если какой-то пользователь запросит {age: 18, name: "Иван"}, монга использует этот индекс, и переберет у себя в поиске только документы с точно такими значениями полей?
Nick
То есть достаточно построить просто индекс {name: 1, city: 1, age: 1, email: 1}, и любой запрос, использующий эти 4 поля в любых комбинациях, будет использовать эффективно этот индекс?
И если какой-то пользователь запросит {age: 18, name: "Иван"}, монга использует этот индекс, и переберет у себя в поиске только документы с точно такими значениями полей?
нет, 4 отдельных индекса
Алексей
3 индекса по 1 полю(без нейм), еще 2 компаунда нейм-сити и нейм-эйдж, так как их искать будут чаще всего. И то я бы посмотрел сколько там данных, и как советовали выше просто в оперативе все это вертел.
Nalik
Привет всем!
Можно ли быстро подсчитать количество вхождений в агрегаторе?
У меня проблема 1 в 1 с постом https://stackoverflow.com/questions/52505585/count-id-occurrences-in-other-collection
Nalik
Но единственное, мне нужно подсчитать количество вхождений в своей коллекции. Этот lookup очень медленно работает.. Индексы на полях chat_id, user_id, leave_time есть.
const dbMyChats = await db.ChatsUser.aggregate([
{ $match: { user_id: 1, leave_time: 0 } },
{
$lookup: {
from: 'chats_user',
let: { chatID: '$chat_id' },
pipeline: [
{ $match: { $expr: { $and: [{ $eq: ['$chat_id', '$$chatID'] }, { $eq: ['$leave_time', 0] }] } } },
{ $count: 'count' },
],
as: 'chats',
},
},
{
$project: {
_id: 0,
chat_id: 1,
count: { $arrayElemAt: ['$chats.count', 0] },
}
},
]);
Anton
Всем привет! Столкнулись с ошибкой при восстановлении полного бэкапа при помощи pbm restore <backup>:
E11000 duplicate key error collection: sponsore.int index: id dup key: { _id: { visitorId: "ccee9f9e-9d05-4113-97b6-38bf85a85a0b", categoryId: 123434 }
После этого бэкапирование прерывается.
Подскажите, есть ли способ заставить pbm игнорировать дубликаты и продолжать восстановление коллекции?
Богдан
Всем привет! Подскажите, как правильно в базе хранить даты. К примеру, мне нужно ввести дату рождения, она может быть:
1. Точная - 03.05.1904
2. Не полная - хх.05.1904 / и хх.хх.1904...
3. Приблизительная - 03.05.1904 / хх.хх.1904
4. Период - 03.05.1904-03.05.1908 / хх.хх.1904 - хх.хх.1908
5. Текстовая - "родился летом до войны"
Nalik
Тут нету ответов, только вопросы
Алексей
Nalik
я хз, я даты храню в Unix
Богдан
Пока идея только записывать как текст и уже на стороне клиента определять, что за дата
Богдан
Vyacheslav
Богдан
Vyacheslav
Ну, у тебя кейсы какие:
Точная, не полная (тоже самое что и приблизительная), период, текстовая
Алексей
Vyacheslav
{
"type": 1,
"exact": "2023-10-24T07:58:08Z"
}
{
"type": 2,
"notExact": {
"day": "*",
"month": "8",
"year": "2012"
}
}
{
"type": 3,
"periodFrom": "2023-10-24T07:58:08Z",
"periodTo": "2028-10-24T07:58:08Z"
}
{
"type": 4,
"text": "родился летом до войны"
}
Vyacheslav
Нуриддин
Богдан
Богдан
Благодарю!
Mar
Anton
Вячеслав
добрый день. а как в mongo поискать по маске а-ля like '%first_word%second_word%' ?
Вячеслав
Nick
PCRE2 ?
чет сразу не понял что имелось в виду, да
Вячеслав
ага, спасибо. вроде бы получилось вот так:
{'field': {$regex: "first_word.*second_word", $options: 'i'}}
Nalik
Nick
Но единственное, мне нужно подсчитать количество вхождений в своей коллекции. Этот lookup очень медленно работает.. Индексы на полях chat_id, user_id, leave_time есть.
const dbMyChats = await db.ChatsUser.aggregate([
{ $match: { user_id: 1, leave_time: 0 } },
{
$lookup: {
from: 'chats_user',
let: { chatID: '$chat_id' },
pipeline: [
{ $match: { $expr: { $and: [{ $eq: ['$chat_id', '$$chatID'] }, { $eq: ['$leave_time', 0] }] } } },
{ $count: 'count' },
],
as: 'chats',
},
},
{
$project: {
_id: 0,
chat_id: 1,
count: { $arrayElemAt: ['$chats.count', 0] },
}
},
]);
а что по сути тут должно делаться? вижу зачемто лукап к той же таблице
Nalik
а что по сути тут должно делаться? вижу зачемто лукап к той же таблице
Все верно. Это таблица с чатами. Должно подсчитывать количество участников в чате.
1. В таблице users хранится информация обо всех пользователях с полями: *user_id, user_login, user_email, user_pass, user_name, user_photo, user_activate*.
2. В таблице chats_list хранится информация обо всех созданных чатах с полями: *chat_id, chat_type, chat_name, chat_photo, create_user_id, create_time*.
3. В таблице chats_user хранится информация обо всех чатах в которых состоит пользователь с полями: *user_id, chat_id, join_time, leave_time, chat_read_time, read_msg_id, chat_sound*.
Nick
Все верно. Это таблица с чатами. Должно подсчитывать количество участников в чате.
1. В таблице users хранится информация обо всех пользователях с полями: *user_id, user_login, user_email, user_pass, user_name, user_photo, user_activate*.
2. В таблице chats_list хранится информация обо всех созданных чатах с полями: *chat_id, chat_type, chat_name, chat_photo, create_user_id, create_time*.
3. В таблице chats_user хранится информация обо всех чатах в которых состоит пользователь с полями: *user_id, chat_id, join_time, leave_time, chat_read_time, read_msg_id, chat_sound*.
ответа на вопрос не увидел
Nalik
Nick
Nalik
На самом деле суть вопроса в другом, как в целом сделать лукап или подсвет более быстрым)
Nalik
К сожалению предметно поговорить уже не смогу, код с примерами не под рукой
Nalik
Завтра буду у ПК, напишу. Не против?
Semyon
db.photos.find({naked:true}) вот так попробуй
Nick
Semyon
Спасибо 😄
Асель
Привет!
подскажите, есть ли возможность дать пользователю привилегию выполнять шаг "out" в aggregation, не давая все rw права ?
пробовала создать роль с createCollection и выдать ее пользователю, но все равно получила ошибку "not authorized to execute command aggregate out"
Nalik
А подскажите, как в архитектуре чата реализовать удаление сообщений только у себя? Это нужно вести отдельную таблицу с удаленными сообщениями? Но она ведь может стать очень громоздкой со временем
Nick
Nalik
Nalik
Я имею ввиду как правильно реализовать архитектуру, как помечать в базе сообщения удаленное для одного пользователя. Условно говоря есть коллекция "messages" где хранятся все сообщения с идентификаторами назначения (допустим chat_id). Вот я Вася решил удалить у себя сообщение, в какой коллекции делать пометку об этом.
Алексей
а зачем в БД ее делать пусть твой клиент(мессенджер?) на гуи это сделает
Nick
Алексей
Асель
Nalik
Грубо говоря будет отдельная коллекция с названием "messages_delete" куда мы будем заносить идентификаторы удаленных сообщений и идентификатор пользователя удалившего сообщения
Алексей
не перепутала) пробовала в консоли и в компасе
просто нагуглил тему что у некоторых это работало в консоли но не работала в джаве) по идее роли на создании коллекции в данной бд должно хватать... а попробуй просто под тем юзером создать коллекцию
Асель
Nick
Nick
Алексей
то есть теперь юзеру ващего мессенджера надо не 1 запрос чтобы получить все свои сообщения а "джойн" двух коллекций?)
Nick
Nalik
Nick
вообще тут также можно в исходном сообщении проставить флаг что у когото из юзеров оно удалено и по нему надо сделать доп проверку