madspectator
я проверил, что оно работает. Но мне интересно, нормально ли для $or считать не булевское значение как истину
Если вас смущает неявное приведение типов, вы можете попробовать явное - https://docs.mongodb.com/manual/reference/operator/aggregation/toBool/
Сергей
спасибо
madspectator
спасибо. Работает. Но как тут работает логическое "или" $or: [{ $ifNull: ["$x", false] }]? Если у x есть значение, то ifNull вернет его. Но это значение не булевское. $or все равно посчитает это за истину?
Мне кажется, если x is not null, то надо возвращать не $x,а true. Если возвращать $x и значение x равно, например, нулю, то потом проблемы возможны. Вообще, я особо не вникал, что там по ссылке, просто скинул ссылку.
JASWGO
Всем привет. Такой вопрос. У меня есть коллекция с данными пользователя и у него есть поле purchased_items это массив String-ов в котором храниться альбомы который купил юзер. Как лучше сделать это? Или лучше создать отдельную коллекцию и туда записывать?
Aleksandr
Зависит от объемов
Aleksandr
Размер одного документа ограничен
JASWGO
да там очень мало будет записей
JASWGO
всего пока 12 альбомов
Mikhail
всем здравствуйте. Товарищи, помогите с вопросом. есть документы типа { "row1" : 111, "row2" : 222 } нужно сделать запрос поиска по типу SELECT * FROM table WHERE (row1+XXX) % row2=0 не получается нагуглить вообще никак работу с несколькими ключами в документе
Геннадий
Точно не помню, но может быть спасёт оператор $where
Геннадий
В него вроде должна передаваться функция на JavaScript, которая сделает всё, что угодно.
Egor
Добрый вечер. Напомните пожалуйста, на mongo 4+ если хочу создать юзера со всеми правами (суперадмин), достаточно ли ему дать роль root или надо каждую роль вроде readWriteAnyDatabase выдавать?
Vened
хотя нет, row2: 0 в данном случае будет как "отсутствие параметра row2"...
Mikhail
хотя нет, row2: 0 в данном случае будет как "отсутствие параметра row2"...
мне нужно проверить условие, что (row1+МоеЗначение) нацело делится на row2
Vened
Возможно, пригодится оператор $mod https://habr.com/ru/post/259219/#2
Mikhail
Возможно, пригодится оператор $mod https://habr.com/ru/post/259219/#2
вот я так понимаю, что mod не принимает в виде значения один из ключей документа на котором мы стоим. и тем более нам нужно сравнить mod от суммы одного ключа плюс внешнего значения
Mikhail
В него вроде должна передаваться функция на JavaScript, которая сделает всё, что угодно.
javaScript скушал. спасибо за совет. если есть идеи без него сделать, то будет тоже круто
Mikhail
Агрегацией?
а можно запрос написать для того чтобы к примеру сложить два поля из одного документа без агрегации?
Mikhail
Зачем? Чем агрегация плоха?
ну я правильно понимаю, что при агрегации мы создаем временную коллекцию?
madspectator
Не знаю, я плохо разбираюсь в агрегации.
Mikhail
:)
Mikhail
Не знаю, я плохо разбираюсь в агрегации.
если есть вариант без нее, я бы рассмотрел, но и с агрегацией тоже будет для меня познавательно
madspectator
Так вы для начала поймите, создаёт ли агрегация overhead или нет. Если нет - вы избегаете несуществующую проблему.
yopp
Но запрос с вычислением в любом случае будет затратным и более эффективной стратегией является хранить вычисленное при вставк/обновлении значение
yopp
Иначе вы будете всегда делать вычислений по количеству документов
Mikhail
Иначе вы будете всегда делать вычислений по количеству документов
да, осознаю, предращитывать мой случай не получится
yopp
А что у вас за случай?
Mikhail
Нет, не создаёт
ну вот если я делаю проекцию данных, где в одном шаге скалдываю свое поле с моей переменной, в другом шаге делаю остаток от деления по одному из полей( не уверен что $mod проглотит как аргумент одно из значений документа), то где эта проекция тогда храниться? или она налету расчитывается?
yopp
Нет, не хранится
Mikhail
А что у вас за случай?
есть периодичность с которой нужно доставать документы. но если мы их не достали по времени, то между периодами их доставать не нужно. Пример: документ1 нужно доставать раз в день начиная с 12:05 к примеру, инфа об этом хранится в документе1, если мы пришли в 12:06, то забрать документ нужно будет в 12:05 следующего дня
Anonymous
Это нормально ?
yopp
Это периодичность?
yopp
Это нормально ?
Зависит от того, выключали ли вы монгу/перезагружали сервер или нет
Anonymous
Зависит от того, выключали ли вы монгу/перезагружали сервер или нет
Проблема изначально в том что я не могу подключиться к бд через компас, вот лог
yopp
А компас на том-же сервере запущен?
Anonymous
Нет
yopp
Тогда вам необходимо включить аутентификацию и поменять bind в конфмге на 0.0.0.0
yopp
Сейчас у вас монга слушает на 127.0.0.1 и будет доступна только с этого хоста
Mikhail
Вы можете рассчитывать значение дополнительного поля в момент вставки/обновления данных.
какие именно? когда в следующий раз запуститься? если я проспал момент когда запуститься в этот день, я должен буду запуститься через период, и получится что я уже либо не обновлю это поле, либо буду его доставать чтобы проверять на стороне совпадает ли периодичность
Anonymous
Тогда вам необходимо включить аутентификацию и поменять bind в конфмге на 0.0.0.0
Я не могу найти, где конфиг находится, можете ссылку какую-нибудь на документацию кинуть пожалуйста ?
Mikhail
А зачем там математика?
я пока не придумал как по другому можно сделать
yopp
я пока не придумал как по другому можно сделать
Зависит от вашей логики, но на мой взгляд лучше хранить точное время следующего выполнения и выбирать документы по этому полю: nextRunAt lte currentTime) Если поле не изменилось, значит задача была пропущена и тут вы уже сами можете решить когда её запускать.
yopp
Если у вас есть ограниченный бюджет на каждый монотонный период (например 5 минут) и вам нужна приоритизация, то в этом случае перед выполнением текущего периода, запрашивать задачи из предыдущего периода и решать что с ними делать — выполнять сейчас или переносить на следующие. Но в любом случае, хранить точное время следующего выполнения
yopp
По нему можно сделать индекс и очень эффективно искать
Ilya
День добрый Подскажите пожалуйста, какой аналог ораклового like для монги И как сделать шрифт запросов которые я пишу в Robo 3T крупнее
Mikhail
По нему можно сделать индекс и очень эффективно искать
это конечно аргумент, но не хотелось доставать эти документы впустую
yopp
День добрый Подскажите пожалуйста, какой аналог ораклового like для монги И как сделать шрифт запросов которые я пишу в Robo 3T крупнее
какие-то простые вещи сделать регулярными выражениями https://docs.mongodb.com/manual/reference/operator/query/regex/ Если хочется «полнотекстовый» поиск то похожего результата можно добиться с текстовым индексом https://docs.mongodb.com/manual/core/index-text/
yopp
это конечно аргумент, но не хотелось доставать эти документы впустую
Дешевле доставать документы, чем обходить всю коллекцию
yopp
Потом можно сделать узкий фильтр с окном
yopp
Не знаю 🤷🏻‍♂️
Алмаз
Добрый день! Можно ли на стороне mongo получить список базы данных в отсортированном виде без участия клиента? //nodejs let mongoCommand = {listDatabases: 1, nameOnly: true}; _db.admin().command(mongoCommand) .then((data) => { // db_list = data.databases; })
Алмаз
Тоже самое касается для списка коллекций в базе данных, получение списка коллекций в отсортированном виде по названию.
Anonymous
Здраствуйте. Можно ли хранить в Mongo обычный html? Как в плане безопасности?
yopp
В виде строки — можно. Не понятно, о какой «безопасности» речь
yopp
Ещё надежнее хранить как GridFS документы, чтоб не заморачиваться с ручной нарезкой больших html документов
꧁༒Dmitry༒꧂
Приветствую. Есть коллекция в базе: [ { myval: 12345678000 name: 'example1' }, { myval: 12345678000 name: 'example2' }, ] Затем вызываю метод агрегации .aggregate([{ $group: {_id: { myval: "$myval", items: { $push: "$$ROOT" } } } }]) Ожидаю что данные на выходе будут сгруппированы по целочисленному полю, но по какой-то причине часть данных не входят в выборку. Куда копать? ```
꧁༒Dmitry༒꧂
У вас $push внутри _id
ставил снаружи, не дает эффекта
yopp
{_id: “$myval”, items: {$push:...}}
꧁༒Dmitry༒꧂
{_id: “$myval”, items: {$push:...}}
спс, проблема в сортировке ...
Гена
@dd_bb Добрый день Подскажите пожалуйста, что ему не нравится db.collection.aggregate([ { $project: { item: 1, attrs: { $objectToArray: "$attributes" } } }, { $project: { attrs: '$attrs.k' } }, { $reduce: { input: '$attrs', initialValue: [], in: { $concatArrays: ["$$value", "$$this"] } } } ]); "operationTime" : Timestamp(1580214295, 21), "ok" : 0, "errmsg" : "Unrecognized pipeline stage name: '$reduce'", "code" : 40324, "codeName" : "Location40324", "$clusterTime" : { "clusterTime" : Timestamp(1580214295, 21), "signature" : { "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="), "keyId" : NumberLong(0) } }
Гена
Unrecognized pipeline stage name: '$reduce - используется согласно примеру из документации
yopp
$reduce это не stage, это оператор
Гена
версия 4.0.4