Andrey
а вот еще одна особенность: Primary:18001 Secondary:18001 Arbiter:18100 порты разные
Andrey
сейчас лезу ковырять
AstraSerg
AstraSerg
Nick
Vladimir
Всем привет!
У меня есть схема eventSchema,
в ней есть prizes: [prizeSchema],
в котором есть winners: [memberSchema],
где есть
user: {
ref: 'user',
type: mongoose.Schema.Types.ObjectId,
}
Как правильно популейтнуть юзера?
Vladimir
.populate({
path: 'prises.winners.user',
model: 'user',
select: '-sessions',
});
Vladimir
?
Oleg
У меня кстати в таком варианте не сохранялись доки с глубиной больше 1
Oleg
То есть winners у меня не сохранялись
Vova
Подскажите, реально ли в одном запросе сделать следующее:
Имеется документ
{
"comments": [
{
"commentId": 1,
...
}
]
}
Мне нужно удалить комментарий по его id, для этого я использую pull filter, но затем мне нужно у всех комментариев, которые стояли за удалённым, поменять их id на -1
Nick
какаято магия над номерами коментариев?
Nick
вообще обычный set с $inc:-1
Vova
Я уже придумал как сделать
Nick
фильтр же по ид
Nick
он у вас есть, т.к. вы по нему удаляли
Vova
Все айди идут по возрастанию, а сделаю update используя $gt от удалённого id
Nick
ну да я про это и говорил
Vova
arrayFilters я так понимаю понадобится
Nick
ага
yopp
Vova
А если коммент из середины удаляется то нужно смещать передние иначе похерится весь код, там привязка к количеству вхождений в комментах при генерации новых айди для новых комментов
Nick
это же вроде тот чел, который спрашивал как сделать инкремент, чтобы потом досылать коменты которые типа пропущены
yopp
ужас
Vova
Не я такого не спрашивал)
yopp
в любом случае — ужас
Nick
знач спутал, тогда вопрос зачем оно нужно актуален))
yopp
мутабельные id почти всегда кусают за жопу
Vova
фронтенд так заказал, я просто рву попку на беке
yopp
ещё хуже
yopp
а кто решение проектировал?
Vova
Это на экзамен проект) конечно в реальном проекте я бы такого не делал
Avral
Привет! Есть коллекции постов и авторов, у некоторых авторов нет постов. В объекте поста author это строка с никнеймом. Как получить всех авторов у которых есть посты ?
Vova
Документ:
{
"_id": 1,
"Comments": [
{
"CommentId": 1,
"CommentText": "Fine"
},
{
"CommentId": 2,
"CommentText": "Good"
},
{
"CommentId": 3,
"CommentText": "Well done"
}
]
}
Результат выполнения запроса:
1) Объект с CommentId: 2 удаляется
2) Объекты с CommentId: >2 сдвигается на -1
3) Объекты с CommentId: <2 без изменений
Запрос:
updateOne({ _id: 1 },
{ $pull: { Comments: { CommentId: 2 } }, $inc: { "Comments.$[a].CommentId": -1 } },
{ arrayFilters: [ { "a.CommentId": { $gt: 2 } } ] })
Vova
Не работает, что делаю неправильно?
Oleg
может кто-то дать пример кода который апдейтит запись в монго (на mongoose)? как ни пытаюсь, мой код не работает.
Oleg
UserData.updateOne(
{login: logEmail},
{$set: {login_token}},
);
вот, например, что тут неправильно?
Nick
зачем использовать монгус если вы делаете нативные запросы? просто вытащите нужный объенкт, поменяйте его и сохраните
Oleg
а... можно пример?
Oleg
я просто гуглил, везде было updateOne/update.
Nick
я не настоящий js прогер поэтмоу из какойто поделки:
let battle = yield Battle.findOne({province_id: battleFromApi.province_id, date: battleFromApi.date});
if (battle == null) {
battle = new Battle(battlesFromApi);
}
Object.assign(battle, battleFromApi);
battle.clan_id = clanId;
battle.update_time = new Date();
yield battle.save();
Oleg
спасибо
Nick
Battle - модель
Vladimir
Есть кто живой?)
Я чёт очкую это на проде запустить:
```
db.users.update({_id: ObjectId("5c00078998335f00139cded4")}, {restaurants: [ObjectId("5c00097898335f00139cdeee")]})
```
Мне проект с монгой по наследству достался, а тут нужно срочняк на боевом поправить
Vova
Скажи что нужно сделать
Vova
Эта строчка ничего не сделает по моему
Vladimir
мне нужно было в массиве restaurants оставить один объект, я уже понял, что это не так делается) и рад, что у меня был результат find под рукой)
Vova
По ходу нужен $pullAll оператор чтобы удалить из массива все элементы, только ещё условие чтобы первый не удалял
Vladimir
> db.users.update({_id: ObjectId("5c00078998335f00139cded4")}, {restaurants: [ObjectId("5c00097898335f00139cdeee")]})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find({_id: ObjectId("5c00078998335f00139cded4")})
{ "_id" : ObjectId("5c00078998335f00139cded4"), "restaurants" : [ ObjectId("5c00097898335f00139cdeee") ] }
Я сделал это))))
Vladimir
Потом пофиксил, полностью его перезаписав)
Vladimir
чуть не поседел, но за 3 секунды нашёл решение)
Oleg
лол
Igor
День, добрый. Первый раз вожусь с монгой, подскажите по query:
У меня сейчас формируется такая штука в .find
{ '$and':
[ { year: { '$gte': 2010, '$lte': 2013 } },
{ meter: { '$gte': 23950, '$lte': 24951 } } ] }
Она нормально фильтрует выборку, но если я добавляю еще и конкретный год через $eq ($in):
{ '$and':
[ { year: { '$gte': 2010, '$lte': 2013, '$eq': 2049 } },
{ meter: { '$gte': 23950, '$lte': 24951 } } ] }
возращает пусто. А должено все года с 2010 по 2013 и 2049
Nick
потому что вы путаете И и ИЛИ
Nick
вам нужно
больше 2010 И маньше 2013 ИЛИ равно 2049
а написано в запросе все через И
Igor
Я пробовал так:
{ '$and':
[ { year: { '$gte': 2010, '$lte': 2013 } },
{ meter: { '$gte': 23950, '$lte': 24951 } } ],
'$or': [ { year: { '$eq': 2049 } } ] }
Igor
Результат тот же
Nick
$and и $or должны быть на разных уровнях вложенности
Nick
сейчас у вас написано
(год:2010-2013 И meter:...) И (год:2049 ИЛИ ничего)
Nick
по умолчанию в монге верхний уровень воспринимается как $and, поэтому если он должен быть $or, то нужно явно указывать
Igor
Хмм, сейчас ракрыл специально и вроде все правильно
https://i.imgur.com/2sNTVV1.png
Al
Всем привет! Нужна помощь(
Как сделать внутри facet причем, что то типа left join?
Al
const folders = await this.aggregate([
{ $match: { parent: ObjectId(folderId), deletedAt: null } },
{
$facet: {
folders: [
{
$match: {
isFile: false
},
},
{
$sort: sortCondition
}
],
files: [
{
$match: {
isFile: true
}
},
{
$sort: sortCondition
}
]
}
},
Nick
{
$or:[
{$and: .....}
{$and: .....}
]}
Al
Нужно добавить в выборку folders которая внутри facet. Данные о том есть ли для каждой folder ссылающаяся на нее folder.linkedTo = folder._id причем если такой нет, исключать записи не надо (left join)
Nick
Al
$lookup
Согласен.. А куда в какую стадию?
Nick
можно до фасета, можно внутри в конец
Nick
ну и примените
Nick
что мешает после сорта вставить7
Al
а почему не после $match: { isFile: false } ?
Al
или не перед сортом?
Nick
можно и туда, от этого ничего не изменится
Al
можно и туда, от этого ничего не изменится
this.aggregate([
{ $match: { parent: ObjectId(folderId), deletedAt: null } },
{
$facet: {
folders: [
{
$match: {
isFile: false
}
},
{
$sort: sortCondition
},
{
$lookup: {
from: "folders",
localField: "_id",
foreignField: "linkedTo",
as: "shared"
}
}
],
files: [
{
$match: {
isFile: true
}
},
{
$sort: sortCondition
}
]
}
},
{
$project: { folders: { $concatArrays: foldersUp ? ["$folders", "$files"] : ["$files", "$folders"] } }
},
{
$unwind: "$folders"
},
{
$project: {
_id: "$folders._id",
name: "$folders.name",
parent: "$folders.parent",
user: "$folders.user",
isFile: "$folders.isFile",
fileSize: "$folders.fileSize",
fileMimetype: "$folders.fileMimetype",
shared: "$folders.shared",
createdAt: "$folders.createdAt",
updatedAt: "$folders.updatedAt"
}
},