yopp
да, $push только добавляет
yopp
$addToSet будет добавлять только уникальные значения, но если premissions разные, то и значения будут разные
Mike
ну там подразумевается что поле userId уникальное для массива
Mike
я вот пока пришел к тому что сначала пулить, потом пушить
yopp
помоему так не выйдет
Mike
ну разными запросами. сначала я вычищаю массив internalShares от всех значений userId: userToShare.publicIdю вторым запросм уже пуш делаю
Mike
но имхо это ка кто криво
yopp
afair, единственое что вы можете сделать это в 4.2 использовать AF в update
yopp
https://docs.mongodb.com/master/reference/command/update/index.html#update-command-example-agg
yopp
до 4.2 только два запроса
yopp
причём мне кажется $pull это не очень идея
yopp
я бы пытался сначала обновить существующий поддокумент, а если nMatched: 0 то делал бы $push
yopp
но это вопрос в том что хуже в вашем случае
yopp
потерять пермишен или оставить старый :)
Mike
я бы пытался сначала обновить существующий поддокумент, а если nMatched: 0 то делал бы $push
там сложновато будет - это своего рода механизм расшаривания файлов,
yopp
я бы поменял схему
yopp
хотя, хз
Mike
я бы поменял схему
😀радикально, ну я думаю нормально составил для мвп схему, относительно удобно сразу получать доступ ко всему одним запросом Медиа. были мысли чтобы shared массивы перенести в другую коллекцию, но что то я подумал нафиг
Mike
сложно становится когда иерархия вот длинная, папка в папке в папке
Кылыч
всем привет. ребята я вытащил из массива objectId все объекты через аггрегейт. но как вытащить теперь объекты из поля в каждом элементе массива. [ { promocodes: { _id: 5dc2a2ec400b60233666a95d, code: 431325, sale: 2, partner: 5da8713622b8613fdc10c3a8, createdAt: 2019-11-06T10:39:40.115Z, updatedAt: 2019-11-06T10:39:40.115Z } }, { promocodes: { _id: 5dc2a89317ad2a366ef288fc, code: 852956, sale: 2, partner: 5da8713622b8613fdc10c3a8, createdAt: 2019-11-06T11:03:47.172Z, updatedAt: 2019-11-06T11:03:47.172Z } } ]. нужно вытащить объект партнера а заменить им поле partner
Serhii
{ $group: { _id: '$_id', messages: { $push: '$messages' }, unreadMessages: { $sum: { $cond: [ { $and: [ { 'messages.readBy': { $nin: [userId]}} ] }, 1, 0 ] } } } }, Есть возможность посчитать каким-то подобным образом непрочитанные сообщения?
Serhii
Вываливается ошибка что нельзя юзать оператор dot
yopp
или reduce
yopp
dot оператор не будет работать
yopp
$sum это аккомулятор, условие находится в контексте отдельного значения массива
Serhii
а как проверить что userId находится внутри messages.readBy?
yopp
покажите схему документа, сейчас контекст не понятен
yopp
но вообще сли у вас readBy это массив, то очень сложно
yopp
вы хотите сделать пересечение двух массивов по сути
yopp
скорее всего вам нужен $setDiffirence и $size
yopp
но я не понимаю что вы делаете :)
yopp
но вообще если unreadMessages это частая операция, то у вас ошибка в дизайне схемы
yopp
потому что вы пишите не так, как читаете
Serhii
order: [{ messages: [{ readBy: [ID] }]}], такая вот схема, нужно разбить месседжи на unread and read(если в массиве readBy, есть определенный айди)
yopp
зачем?
yopp
почему нельзя на клиенте это сделать?
yopp
попробуйте с $setDiffirence
Serhii
на самом деле по большей части ради интереса, понятно что я руками могу посчитать с помощью jsa
yopp
моя личная субъективная позиция что в базу данных не надо складывать бизнес-логику
yopp
чем проще запросы, тем лучше
yopp
так как эта трансформация это скорее всего слой отображения, не вижу причин почему это должно быть в монге :)
Serhii
@dd_bb понял) спасибо
yopp
а так, $setDiffirence, наверное
Serhii
@dd_bb а еще такой вопрос, почему такие операторы как eq, not, работают внутри $cond, а $nin - нет?
yopp
¯\_(ツ)_/¯
yopp
$nin это синтаксический сахар над $or, скорее всего исторические причины ограничивают его стадией фильтра для курсора
Serhii
под капотом там какой-то цикл + оператор $or?
yopp
никакого цикла
yopp
просто expand из $in: [a, b, c] в [$eq a] $or [$eq b] $or [$eq c]
yopp
(хотя смотря что вы под циклом имеете ввиду)
Ruslan
Всем привет. Подскажите, пожалуйста, могу ли я создать вьюху db.createView так, чтобы внутри использовалась внешняя переменная. db.myView.find({companyId: 'somevalidid'})? Чтобы внутри View использовалась моя companyId
Bohdan
ты можешь скрипт создать который вначале вытащит companyId который тебе нужен а потом заинсертит в твою вьюху
Ruslan
у меня с клиента приходят параметры для поиска. Могу я сюда скинуть то что у меня вышло ?
Bohdan
кидай
Ruslan
db.createView('companiesByBassisesCommoditiesSettings', 'companies', [ { $lookup: { from: "users", localField: "_id", foreignField: "companies", as: "users_res" }, }, { $match: { $and: [ { "users_res.activity.buySell": { $in: VARIABLE1 } }, { "users_res.activity.currencies": { $in VARIABLE2 } }, { "users_res.activity.basises": { $in: VARIABLE3 } }, { "users_res.activity.commodities": { $in: VARIABLE4 } } ] } }, { $replaceRoot: { newRoot: { $mergeObjects: [{ $arrayElemAt: ["$users_res", 0] }, "$$ROOT"] } } }, { "$sort": { "_id": 1 } }, { $project: { "usersId": "$users_res._id", _id: 0, } } ]) db.companiesByBassisesCommoditiesSettings.find({ VARIABLE1: [1], VARIABLE2: [2], VARIABLE3:[4], VARIABLE4:[6] })
Ruslan
вот так хочу
Ruslan
вот там где VARIABLE надо передеавать свои переменные
Bohdan
где находятся твои переменные?
Ruslan
они будут приходить с клиента на серевер
Ruslan
юзер вбивает в попапе эти переменные, а вьюха ему отдает данные исходя из того что вбил юзер
Dmitrii
mongo не поддерживает мастер-мастер?
yopp
они будут приходить с клиента на серевер
create view не позволяет использовать динамические переменные
yopp
выражение для view должно быть законченым в момент создания
Ruslan
понял. спасибо!
Dmitrii
нет
тогда мастер-мастер можно самому через шардинг реализовать? или ещё что можно придумать?
yopp
всё зависит от ваших задач
Dmitrii
ну я делаю шардинг и сам перегоняю дату чтобы было что-то похожее на мастер мастер
yopp
понял. спасибо!
view это виртуальная коллекция, а не хранимая процедура
Ruslan
view это виртуальная коллекция, а не хранимая процедура
а я же могу создать что - то по типу storage процедуры?
yopp
нет
yopp
расскажите о задаче
Dmitrii
нет редактирования данных. только инсерт и селект. будет 2 сервера. например рф и юса. инсерты и селекты идут на нужный сервер по локации. а дальше в фоне данные реплицируются приложением.
yopp
https://docs.mongodb.com/manual/tutorial/sharding-high-availability-writes/
yopp
не нужно в фоне
yopp
и https://docs.mongodb.com/manual/tutorial/sharding-segmenting-data-by-location/
yopp