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
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
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
yopp
выражение для view должно быть законченым в момент создания
Ruslan
понял. спасибо!
Dmitrii
нет
тогда мастер-мастер можно самому через шардинг реализовать? или ещё что можно придумать?
yopp
yopp
всё зависит от ваших задач
Dmitrii
ну я делаю шардинг и сам перегоняю дату чтобы было что-то похожее на мастер мастер
yopp
понял. спасибо!
view это виртуальная коллекция, а не хранимая процедура
yopp
нет
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