Андрей
dnacd 🦜
Андрей
Nick
Так пока 1 отправляет запрос на обновление, 2 успевает его найти. В этом то и трабл)
такие траблы решить легко и есть два варианта
1. использование транзакции - когда юзер ставит метку в транзакцию заваравчивается новый файнд и апдейт с простановкой метки, если если ее нет
2. делается update по услвоию _id=id и user_i==null (или не суествует, зависит от вашей структуры). И проверяется в результате запроса сколько документов было обновлено - если 1, то значит успешно проставил, если 0 - то значит ктото успел проставит ьфлаг пока летел запрос.
Nick
оба вариант атомарны и решают требуемую задачу
Андрей
Nick
dnacd 🦜
Андрей
Или сначала отправить update по условию, а затем find
Nick
Андрей
перефразируйте
Как вытащить обновленный документ? Отправил я update, как описано в варианте 2, документ обновился. Как теперь получить его? Новый find запрос?
Насколько я помню, update не возвращает обновленный документ
Nick
Андрей
Андрей
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
Vladimir
Я хочу получать определённый документ
В этом документе массив users, в котором может быть до 5000 элементов с данными
Как лучше для производительности?
Получать данные с документа без users
А потом снова делать запрос для получения массива users и находить определённые элементы с массива
Либо сразу всё получать и уже дальше взаимодействовать, т.е. искать определённые элементы в массиве users ?
Nick
Vladimir
Мне отттуда нужны:
Кол-во юзеров
И определённые ( с правами доступа)
Vladimir
Vladimir
Vladimir
Vladimir
Vladimir
Спасибо)
Vladimir
Vladimir
Можно ли как - то обрезать(ограничить) в выдаче массив внутри док-та?
Nick
Vladimir
Vladimir
Можно ли как - нибудь с filter использовать slice ?
Daniel
Первая ссылка в гугле, либо документации кст
Daniel
Декомпозирую для тебя:
Шаг 1: Научится ГУГЛить
Шаг 2: Научиться правильно формировать поисковой запрос
Например, мой выглядел так: slice filter mongodb
Vladimir
Daniel
Тот же ответ
Daniel
Nick
дефисы могут создать проблем, поэтому либо через подчеркивание либо через большую букву - тут уж как вам больше нравится и как привычнее в вашем языке
Dr.
У меня есть документ в котором хранится массив с Id других объектов:
fields: [
ObjectId('627a6edee0269da6c6f82566'),
ObjectId('627a6ee3e0269da6c6f82569')
]
Можно как-то на уровне базы или mongoose выбрасывать ошибку при попытке добавить несуществующий Id?
Nick
COHuK
Вопрос. Есть 2 сущности, например пользователи и посты (классика).
В постах с помощью привязки Types.ObjectId есть связь с пользователями, которые эти посты написали.
Вопрос. Как реализовать обратную связь, то есть при добавлении нового поста обновлять количество постов в сущности пользователя?
COHuK
Надеюсь понятно объяснил )
P1GAS
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();
}
);
P1GAS
COHuK
🙈 спасибо
ReactIsFramwork
И все четверо поди боты
ReactIsFramwork
Поцаны, почем биток?
ReactIsFramwork
Кикните их всех четверых плиз
ReactIsFramwork
Явные боты же
Roman
Добрый вечер!
А robo3t studio не качается с сайта с русского айпишника по очевидным причинам или у меня плохой айпишник?
Roman
Cloudflare говорит access denied
Nick
Eva🇺🇦
Кто-то покупал? Полезная литра?
https://masteringjs.io/ebooks/mastering-mongoose
Владимир
Подскажите как запросом со всех документов одной коллекции вытянуть только лишь по одному определенному полю всех документов, чтобы не тянуть все документы на сервер?
Cloud
projection
Владимир
Artem
Привет! Народ, помогите найти ошибку. —>
Error: Cast to undefined failed for value undefined at path &quot; <--
Задача: получить коллекцию с БД, Если ее нету - вернуть пустой массив.
Есть модель:
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 &quot; <--
Задача: получить коллекцию с БД, Если ее нету - вернуть пустой массив.
Есть модель:
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
})
}
так ведь все то же самое что и выше предлагал, ищите где у вас не проинициализированы переменные или обращение к неправильным полям
Vova
Добрый день! Подскажите пожалуйста, можно как-то запустить монго шелл чтобы он выполнил и вернул в stdout одну команду?
yopp