Aleksandr
{ field: { $exists: true } }
Dmitriy
{ field: { $exists: true } }
не прокатывает:
"items": {$cond: [{$or: [{$eq: ["$items", null]}, {$exists: ["items", false]}, {$eq: ["$items", []]}]}, [""], "$items"]},
Dmitriy
падает с ошибкой: "Unrecognized expression '$exists'
Dmitriy
разобрался, сделал через грязный хак, мало ли кому будет полезно:
```
"items": {$cond: [{$or: [{$eq: ["$items", null]}, {$eq: ["items[0]", null]}, {$eq: ["$items", []]}]}, [""], "$items"]},
Nick
разобрался, сделал через грязный хак, мало ли кому будет полезно:
```
"items": {$cond: [{$or: [{$eq: ["$items", null]}, {$eq: ["items[0]", null]}, {$eq: ["$items", []]}]}, [""], "$items"]},
$ifNull
Nick
посмотрите поведение в примерах, думаю то что надо
https://docs.mongodb.com/manual/reference/operator/aggregation/ifNull/
Dmitriy
да, я смотрел на эту функцию, но не понял как можно с ней сделать так, чтобы в результате происходил не возврат значения, а булева переменная
Dmitriy
у меня просто условие составное получается
Dmitriy
поле может быть null, может быть [] пустым массивом или его вообще может не быть
Dmitriy
собственно если любое из условий выполняется, то мне $cond должен отдать [""] для последующего $unwind
Nick
делаете ифНулл и возвращаете пустой массив по нулу, потом уже это сравниваете пустой массив или не пукстой в кондишне
Dmitriy
да, можно еще $project выше запилить, согласен - не подумал, спасибо
Nick
не знаю точно, но попробуйте прям в кондишне это сделать
Dmitriy
только сразу вопрос, а что дешевле по накладным расходам еще один project или мой грязный хак, что я привел выше?
Nick
дешевле нормально данные подготовить
Dmitriy
это тоже можно, но хочется поддержать обратную совместимость с теми данными, которые уже есть
Nick
вот вы их один раз превратите в нормальные и такой пробелмы больше не будет
Dmitriy
кстати, а это мысль. чет я не подумал про простой апдейт)))
Dmitriy
спасибо!!!!
Nick
вот это уже правильное направление
Nick
например просетить пустой массив везде где его нет или он равен нулу
Nick
и вот у вас уже минус два условия
Dmitry
Всем привет!
Ищу инструкцию, как настроить master-slave для версии 4.2 - не найду, может у кого-то имеется?
inqfen
А документация чем не устраивает?
inqfen
https://docs.mongodb.com/manual/reference/method/rs.initiate/#rs.initiate
Ну тут все ссылочки есть
inqfen
И описание репликации, там желательно весь раздел почитать, а не скопипастить коданды со стековерфлоу
Dmitry
inqfen
https://docs.mongodb.com/manual/tutorial/deploy-replica-set-with-keyfile-access-control/
ты я смотрю там принципиально на ссылки не жмякаешь
Dmitry
inqfen
По дефолту ее вообще нет, в доке тоже сказано, что убедитесь, что у вас сеть закрыта
Dmitry
inqfen
ну значит что-то недонастроил, если connection refused
inqfen
может монга этот интерфейс не слушает
Dmitry
inqfen
И элегантным движением вопрос про авторизацию превращается в строчку в конфиге
inqfen
А если бы сначала доку таки почитал - его бы и не было)
Dmitry
Farik
Ребят подскажите почему не срабатывает данный запрос все из за "_id"?
Farik
req.params.id - содержит либо 5d777ecda4cfd330ec99746c либо просто строку логин "admin" к примеру
Farik
или сделать проверку !ObjectId.isValid(req.params.id) то делаем запрос по login иначе _id
Farik
но чет такое себе..
yopp
но чет такое себе..
Если _id по умолчанию, то вам необходимо из строки сделать ObjectId объект и передать его в условии.
В вашем случае рекомендую не смешивать поиск по _id и логину и использовать отдельные параметры.
Farik
У меня зависит от того заполнил ли юзер поле "login" если заполнен то find по login'у иначе _id (для красивенького урла) что-то типа localhost:8080/@admin
Farik
λ
Что-то опять я не понимаю монгу 😊
Нужно обновить все сабдоки в масиве, у которых поле manual: true
Задумка:
.updateMany(
{'images.manual': true},
{$inc: {'images.$.order': 900}}
)
λ
Но обновляется только первый.
images.$[].manual': true тоже не работает как я думал :(
λ
Наверное нужно делать $unwind парвить и как-то возвращать в масив опять…
Daniil
.updateMany({}, { $inc: { "images.$[elem].order" : 900 } }, { arrayFilters: [ { "elem.manual": true } ] })
https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/
Anonymous
Daniil
Там есть ссылка на доку, где как раз рассказывается как исправить
λ
Vladislav
Ребята, всем привет! Таковой вопрос. Сейчас изучаю MongoDB и понадобилось решить такую задачу через Aggregation Pipeline. Есть документ, в котором есть массивы объектов purchase и views. В каждом пункте этих массивов есть поля count. Так вот задача заключается в том, что нужно создать запрос, который выберет только те корневые документы, у которых sum(purcahses.count) > 200, но sum(views.count) < 100.
Vladislav
То есть фильтрация по нескольким группам
Vladislav
Не могу нагуглить.
Vladislav
Как можно составить такой пайплайн?
yopp
$addFields & $reduce + $match
Vladislav
Или первые два - это для $group операторы?
yopp
$addFields это первый шаг, где $reduce чтоб посчитать сумму и добавить ёё как новый атрибут и второй шаг $match чтоб отфильтровать по нему
yopp
group вам не нужен
Vladislav
Спасибо. Тогда почитаю про эти стадии)
yopp
Но я рекомендую сумму считать при добавлении значения в массив
Vladislav
А если задача будет отфильтровать не по сумме, а по усредненному значению, то структура пайплайна не изменится?
yopp
Нет, принцип останется такой-же. Но учтите что этот пайплайн переберет все документы в коллекции, если документов много и они большие это может быть очень не быстро.
Vladislav
Vladislav
db.atrn.aggregate( [
{
$addFields: {
purchaseSum: { $sum: "$purchases.price" },
viewsSum: { $sum: "$views.count" }
}
},
{
$match: {
purchaseSum : { $gt : 200},
viewsSum : {$lt: 100}
}
}
])
yopp
А, если там просто значения то да
yopp
В этом случае я настоятельно рекомендую преагрегировать эти значения
yopp
Особенно если вы будете часто по этим значениям запрашивать
yopp
При добавлении значения в массив обновлять счётчик
Vladislav
Аа. то есть денормализацию грубо говоря сделать
yopp
Или использовать views, в частности materialized view из 4.2
Vladislav
А вообще, так в среднем по больнице, aggregation pipeline намного медленее, чем в реляционных базах (PostgreSQL например).?
Vladislav
если сравнивать с GROUP BY
yopp
В среднем по больнице монга совершенно другое хранилище
yopp
Сравнение не имеет практического смысла
Vladislav
Просто мы как раз сейчас хотим хранение данных по сессиям на сайте (где каждая сессия будет представлять собой документ, информацию о покупках, о просмотрах страниц, ...) в MongoDB из Postgresql. Так как поняли, что реляционная модель нам плохо подходит. Но нужно решать задачи по сегментации пользователей. То есть делать выборки пользователей, по условиям, похожим на "(Накупили товаров на больше чем 200 р) И (заходил на такую-то страницу) ИЛИ (просмотрел в сумме 10 страниц) И (....))