dnacd 🦜
Так пока 1 отправляет запрос на обновление, 2 успевает его найти. В этом то и трабл)
но если запрос на обнову был послан, и второй юзер попробует это сделать ещё раз, то можно обработать этот этап.
Андрей
но если запрос на обнову был послан, и второй юзер попробует это сделать ещё раз, то можно обработать этот этап.
Пока 1 находит и хочет отправить обнову, 2 так же находит, в промежутке между find и update у 1. Поскольку у 1 не успел выполниться update, у 2 нет преград повторить тож самое
dnacd 🦜
Пока 1 находит и хочет отправить обнову, 2 так же находит, в промежутке между find и update у 1. Поскольку у 1 не успел выполниться update, у 2 нет преград повторить тож самое
не, поиск - запрос - обновление на этапе поиска может быть несколько человек запрос на обновление может послать только первый
Nick
Так пока 1 отправляет запрос на обновление, 2 успевает его найти. В этом то и трабл)
такие траблы решить легко и есть два варианта 1. использование транзакции - когда юзер ставит метку в транзакцию заваравчивается новый файнд и апдейт с простановкой метки, если если ее нет 2. делается update по услвоию _id=id и user_i==null (или не суествует, зависит от вашей структуры). И проверяется в результате запроса сколько документов было обновлено - если 1, то значит успешно проставил, если 0 - то значит ктото успел проставит ьфлаг пока летел запрос.
Nick
оба вариант атомарны и решают требуемую задачу
Андрей
Или сначала отправить update по условию, а затем find
Андрей
перефразируйте
Как вытащить обновленный документ? Отправил я update, как описано в варианте 2, документ обновился. Как теперь получить его? Новый find запрос? Насколько я помню, update не возвращает обновленный документ
Андрей
да новый find
Ок, спасибо
Андрей
1. Апдейт по условию user_i == 0, обновляю на своё 2. Если все ок, то отправляю find, с условием что user_i равен нужному мне значению Надеюсь, всё правильно
Space
Всем доброго вечера,подскажите пожалуйста, в приложении уже есть авторизация,но не подключена к Mongodb,как её можно подключить и как сделать что бы приходило подтверждение по почте(коду что в почте),если не сложно,подскажите пожалуйста,только начинаю 🙏🙏🙏🙏
🅰️nimeCoder
Имеется документ такого вида: { _id: % SomeObjId % , list: [{ identifer: 'one', start: % SomeDate % , notify: [{ ntype 'notifyone', created: SomeDate }, { ntype 'notifytwo', created: SomeDate }] }] } Ну и собственно два вопроса: 1) Как сделать $push в массив list, объекта с identifer: 'one', только при условии что его там нету, т.е избежать дублирование 2) Как сделать $push в массив notify внутри объекта с identifer: 'one', только при условии что объекта с ntype: notifyone там не существует, т.е чтоб не было дублирования Я чет не могу понять, как сделать, вроде пробовал по разному, но не вышло
Nick
Имеется документ такого вида: { _id: % SomeObjId % , list: [{ identifer: 'one', start: % SomeDate % , notify: [{ ntype 'notifyone', created: SomeDate }, { ntype 'notifytwo', created: SomeDate }] }] } Ну и собственно два вопроса: 1) Как сделать $push в массив list, объекта с identifer: 'one', только при условии что его там нету, т.е избежать дублирование 2) Как сделать $push в массив notify внутри объекта с identifer: 'one', только при условии что объекта с ntype: notifyone там не существует, т.е чтоб не было дублирования Я чет не могу понять, как сделать, вроде пробовал по разному, но не вышло
не ломайте голову и либо меняйте схему на удобную, либо обновляйте док полностью в коде. Извращения с написание такого запроса который вам нужен займут много времени, по сути вам тут поможет только апдейт с агрегацией и вот как будет выглядеть такой пайп агрегации который делает то что вам надо я особ не представляю, но то чно это не пара простых стейджей в целом первое можно попробовать сделать через $elemMatch, но второе так сделать не получится, т.к. массив второго уровня вложенности
🅰️nimeCoder
ну я в прицнипе пришел к тому же самому выводу, я пробовал эту решать задачу так ранее, но у меня не получилось, я просто вынес notify на первый уровень, но решил попробовать снова)
Nick
там проблема со вторым и последующими уровнями вложенности массивов, их можно использовать только если добавление без условий или на крайняк через $addToSet с исключением полной копии
🅰️nimeCoder
Ну я так уже и понял, просто думал есть какой то способ который не пробовал, спасибо
Nick
простого - нет) есть сложный, но под рукой нет ссылок, по сути там километровый пайплайн который в update испольузется
🅰️nimeCoder
Vladimir
Я хочу получать определённый документ В этом документе массив users, в котором может быть до 5000 элементов с данными Как лучше для производительности? Получать данные с документа без users А потом снова делать запрос для получения массива users и находить определённые элементы с массива Либо сразу всё получать и уже дальше взаимодействовать, т.е. искать определённые элементы в массиве users ?
Vladimir
Мне отттуда нужны: Кол-во юзеров И определённые ( с правами доступа)
Nick
Мне отттуда нужны: Кол-во юзеров И определённые ( с правами доступа)
можете отфильтровать перед возвратом из базы через https://www.mongodb.com/docs/manual/reference/operator/aggregation/filter/
Nick
Блин... Кто знает как использовать $filter с $in ?
общее для $in в агрегациях https://www.mongodb.com/docs/manual/reference/operator/aggregation/in/
🅰️nimeCoder
Блин... Кто знает как использовать $filter с $in ?
{ $filter: { input: <array>, as: "item", cond: { "$$item.field": { $in: [ 5, 15 ] } } } }
Vladimir
{ $filter: { input: <array>, as: "item", cond: { "$$item.field": { $in: [ 5, 15 ] } } } }
Такой способ работает Но это вообще не соответствует требованиям
Nick
Такой способ работает Но это вообще не соответствует требованиям
cond: { $in: ["$$users......", ["admin", "helpr"]] }
Nick
Такой способ работает Но это вообще не соответствует требованиям
и чтобы не путаться лучше в "as" пердавать название в единственном числе user и использование в кондие будет читаемее через $$user.data..
Vladimir
Спасибо)
Vladimir
Можно ли как - то обрезать(ограничить) в выдаче массив внутри док-та?
Vladimir
$slice
Спасибо!
Vladimir
Можно ли как - нибудь с filter использовать slice ?
Daniel
Можно ли как - нибудь с filter использовать slice ?
https://stackoverflow.com/questions/36126289/how-to-slice-a-filter-result-in-mongodb
Daniel
Первая ссылка в гугле, либо документации кст
Vladimir
Первая ссылка в гугле, либо документации кст
Я сижу на яндексе и почему - то не видел этого... Спасибо!
Daniel
Декомпозирую для тебя: Шаг 1: Научится ГУГЛить Шаг 2: Научиться правильно формировать поисковой запрос Например, мой выглядел так: slice filter mongodb
Daniel
Тот же ответ
Daniel
Nick
дефисы могут создать проблем, поэтому либо через подчеркивание либо через большую букву - тут уж как вам больше нравится и как привычнее в вашем языке
Dr.
У меня есть документ в котором хранится массив с Id других объектов: fields: [ ObjectId('627a6edee0269da6c6f82566'), ObjectId('627a6ee3e0269da6c6f82569') ] Можно как-то на уровне базы или mongoose выбрасывать ошибку при попытке добавить несуществующий Id?
COHuK
Вопрос. Есть 2 сущности, например пользователи и посты (классика). В постах с помощью привязки Types.ObjectId есть связь с пользователями, которые эти посты написали. Вопрос. Как реализовать обратную связь, то есть при добавлении нового поста обновлять количество постов в сущности пользователя?
COHuK
Надеюсь понятно объяснил )
P1GAS
Надеюсь понятно объяснил )
Думаю, ручками, я реализовал что-то такое с помощью static
COHuK
Думаю, ручками, я реализовал что-то такое с помощью static
То есть скорее всего автоматически такой "контроль" не реализуется...
P1GAS
Вот код реализации PostSchema.statics = { incCommentCount(postId) { return this.findByIdAndUpdate( postId, { $inc: { commentCount: 1 } }, { new: true } ); }, decCommentCount(postId) { console.log("postId", postId); return this.findByIdAndUpdate( postId, { $inc: { commentCount: -1 } }, { new: true } ); }, };
P1GAS
CommentSchema.pre("save", async function (next) { if (!this.isNew) { next(); } if (this.publicationType === "post") { await Post.incCommentCount(this.publicationId); } next(); }); CommentSchema.pre("updateOne", function (next) { this.updated = true; next(); }); CommentSchema.pre( "deleteOne", { document: true, query: false }, async function (next) { if (this.publicationType === "post") { await Post.decCommentCount(this.publicationId); } next(); } );
COHuK
🙈 спасибо
ReactIsFramwork
И все четверо поди боты
ReactIsFramwork
Поцаны, почем биток?
ReactIsFramwork
Кикните их всех четверых плиз
ReactIsFramwork
Явные боты же
Roman
Добрый вечер! А robo3t studio не качается с сайта с русского айпишника по очевидным причинам или у меня плохой айпишник?
Roman
Cloudflare говорит access denied
Roman
аналогично, проще под впн попробовать сразу
так и сделал, но как то странно, аккаунт то зарегался и продукт активировался 😄
Nick
так и сделал, но как то странно, аккаунт то зарегался и продукт активировался 😄
там и атлас веб морда не пускает, но сами базы полностью доступны. Так что видимо не совсем все отрезают, а только самое очевидное
Eva🇺🇦
Кто-то покупал? Полезная литра? https://masteringjs.io/ebooks/mastering-mongoose
Владимир
Подскажите как запросом со всех документов одной коллекции вытянуть только лишь по одному определенному полю всех документов, чтобы не тянуть все документы на сервер?
Cloud
projection
Владимир
Artem
Привет! Народ, помогите найти ошибку. —> Error: Cast to undefined failed for value undefined at path " <-- Задача: получить коллекцию с БД, Если ее нету - вернуть пустой массив. Есть модель: const Soldier = new mongoose.Schema({ title: { type: String, required: true }, image: { type: String, required: true }, rank: { type: String, required: true }, status: { type: String, default: '1' }, created_at: { type: Date, default: new Date() }, updated_at: { type: Date, default: new Date() } }) export default mongoose.model('Soldier', Soldier) Есть сервис: export const getSoldiers = async ({ offset = 0, limit = 9 }) => Soldier.find({}, null, { skip: parseInt(offset), limit: parseInt(limit) }) Есть контроллер: export const SoldiersListController = async (request, response, next) => { try { const { offset, limit } = request.query const soldiers = await getSoldiers({ offset, limit }) return response .status(200) .json({ status: true, soldiers: Array.isArray(soldiers) ? soldiers.map(soldier => SoldiersListItemMapper(soldier)) : [] }) } catch (error) { next(error) } return response .status(200) .json({ success: true, data }) }
Nick
Привет! Народ, помогите найти ошибку. —> Error: Cast to undefined failed for value undefined at path " <-- Задача: получить коллекцию с БД, Если ее нету - вернуть пустой массив. Есть модель: const Soldier = new mongoose.Schema({ title: { type: String, required: true }, image: { type: String, required: true }, rank: { type: String, required: true }, status: { type: String, default: '1' }, created_at: { type: Date, default: new Date() }, updated_at: { type: Date, default: new Date() } }) export default mongoose.model('Soldier', Soldier) Есть сервис: export const getSoldiers = async ({ offset = 0, limit = 9 }) => Soldier.find({}, null, { skip: parseInt(offset), limit: parseInt(limit) }) Есть контроллер: export const SoldiersListController = async (request, response, next) => { try { const { offset, limit } = request.query const soldiers = await getSoldiers({ offset, limit }) return response .status(200) .json({ status: true, soldiers: Array.isArray(soldiers) ? soldiers.map(soldier => SoldiersListItemMapper(soldier)) : [] }) } catch (error) { next(error) } return response .status(200) .json({ success: true, data }) }
так ведь все то же самое что и выше предлагал, ищите где у вас не проинициализированы переменные или обращение к неправильным полям
Artem
так ведь все то же самое что и выше предлагал, ищите где у вас не проинициализированы переменные или обращение к неправильным полям
Так, дело в том, что все нормально проинициализировано. Там несколько полей. Я переписывал модель и переписывал функции модели, переписывал контроллер, роуты. Похожий модуль - работает без проблем и получает список объектов, если такой есть в базе, а если нет - пустой массив. Все аналогично и с коллекией «soldiers», но не могу получить из-за ошибки —> Error: Cast to undefined failed for value undefined at path " <--
Vova
Добрый день! Подскажите пожалуйста, можно как-то запустить монго шелл чтобы он выполнил и вернул в stdout одну команду?