Игорь
Он ж не влез в обьект
Nick
Nick
Points and config модели.
Мой запрос
js
Points.aggregate([
{
$lookup: {
from: "configs",
let: { objName: { $toObjectId: "$name" } },
pipeline: [
{
$match: { $expr: { $eq: ["$points._id", "$$objName"] } },
},
],
as: "output",
},
},
]);
В моделе points есть name<string> (_id из модели config.points)
Если name == points._id из конфига выводим.
Мой запрос вроде кажеться идеальным но чот не работает, может кто шарит?
по работе с point преполагал, что вы в нем и делаете запрос
Игорь
Делаю запрос из коллекции points
Nick
тогда верно составлено
Игорь
Такой запрос тоже неудача, я не знаю в какую сторону копать
Nick
а вручную запрос в монгошеле отрабатывает?
Игорь
Игорь
Игорь
Проверил запрос в шелле компаса , тоже самое
Игорь
Может eq не может сравнивать по ObjectId?
Nick
тут похоже проблема с массивом
Игорь
Игорь
Nick
такс, это такое поведение $eq внутри $expr: оно сравнивает по значению, а не как в случае find-а испольузется для фильтрации
https://docs.mongodb.com/manual/reference/operator/aggregation/eq/
Игорь
шик блеск, как тогда сравнивать
Игорь
Я отталкивался от этого
https://stackoverflow.com/questions/41093647/mongodb-join-on-id-field-from-string-to-objectid
Nick
шик блеск, как тогда сравнивать
pipeline: [
{$unwind: "$points"},
{$match: { $expr: { $eq: ["$points._id", "$$objName"] } },},
],
Игорь
воу
Игорь
работает
Игорь
спасибо большое
Nick
только это будет без индексов и медленно на больших объемах
🅰️nimeCoder
Имеется такой документ
Как во всех документах, изменить payload, у объекта с _id равным c275a8dc295a89c4e237b020 внутри объекта childrens в массиве по любому ключу ( от 1 до ∞ )
Для большей ясности, из этого:
{
"_id": "ЛЮБОЙ ID",
"childrens": {
"ЛЮБОЕ ЧИСЛО": [
{
"_id": "c275a8dc295a89c4e237b020",
"payload": "123"
}
],
}
}
получить:
{
"_id": "ЛЮБОЙ ID",
"childrens": {
"ЛЮБОЕ ЧИСЛО": [
{
"_id": "c275a8dc295a89c4e237b020",
"payload": "НОВОЕ ЗНАЧЕНИЕ"
}
],
}
}
При этом c275a8dc295a89c4e237b020, может находится в массиве childrens.ЛЮБОЕ ЧИСЛО по любому индексу
Nick
Имеется такой документ
Как во всех документах, изменить payload, у объекта с _id равным c275a8dc295a89c4e237b020 внутри объекта childrens в массиве по любому ключу ( от 1 до ∞ )
Для большей ясности, из этого:
{
"_id": "ЛЮБОЙ ID",
"childrens": {
"ЛЮБОЕ ЧИСЛО": [
{
"_id": "c275a8dc295a89c4e237b020",
"payload": "123"
}
],
}
}
получить:
{
"_id": "ЛЮБОЙ ID",
"childrens": {
"ЛЮБОЕ ЧИСЛО": [
{
"_id": "c275a8dc295a89c4e237b020",
"payload": "НОВОЕ ЗНАЧЕНИЕ"
}
],
}
}
При этом c275a8dc295a89c4e237b020, может находится в массиве childrens.ЛЮБОЕ ЧИСЛО по любому индексу
$arrayToObject и $objectToArray, анвинды и группировки вам в помощь. Когда устанете делать запрос прикиньте как можно было бы обойтись без "ЛЮБОЕ ЧИСЛО" в качестве ключа и как быстро вы сможете мигрировать на новую нормальную структуру данных. Ну и потом скорее всего проще скриптом все это сделать чем извращаться
Ilya
только зашёл а уже удалённый аккаунт...
Kinderwond
можно ли в атласе во вкладке perfomance вычислить slow queries (коллекция, операция)?
Abdulloh
Привет ребята
Как можно эту ошибку исправить
Hellomik
что быстрее lookup внутри Lookup или сделать 2 соседних лукапа и самим уже замутить ?
B
Ребята как лучше можно реализовать категории, подкатегории для товара
Р00-👨🏻💻Михаил
category с полем parent
item с полем category
B
Есть примерно вот такая бд. Где категории уже заполнены и при добавлении товара продавец лишь выбирает категорию. Теперь как в странице продавца можно вывести Категории к которым его товары относятся
Одилбек
Alex
Все добрый день
Коллеги, подскажите пожалуйста, как правильно описать запрос, чтобы он проверил, если ли в базе объект, если нет то создал и вернул созданный либо найденный объект
Вот так все работает, кроме того, что если объекта нет, то он его создает, но не возвращает
const user = await User.findOneAndUpdate(
{ userId, operator },
{ $setOnInsert: config },
{ upsert: true, returnDocument: 'after', useFindAndModify: false }
)
yopp
вам нужен аналог флага returnNewDocument: true
https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
Konstantin
тут такое дело что на уровне протокола нет команды findOneAndUpdate. есть findAndModify и есть update. update не умеет возвращать изменённый документ и похоже что флаг useFindAndModify – это чисто монгузовская фигня, которая говорит монгузу использовать именно update. а вот findAndModify как раз всегда возвращает документ, либо в состоянии до обновления либо после и драйвер мапит returnDocument на поле new запроса…
Alex
Illia
Привет.
В коллекции лежат тысячи документов. В каждом из них есть такие поля:
accountID,
accountOwner,
accountName,
field1,
field2,
field3,
field4,
...
При получении данных, как сгруппировать fields из разных документов в массив? (первые три поля везде будут одинаковые). На выходе должен быть один или несколько документов, в зависимости от того сколько разных accountID, accountOwner, accountName найдётся.
Стоит ли вообще группировать это так или просто работать с сырым результатом программой?
Viktar
Привет.
В коллекции лежат тысячи документов. В каждом из них есть такие поля:
accountID,
accountOwner,
accountName,
field1,
field2,
field3,
field4,
...
При получении данных, как сгруппировать fields из разных документов в массив? (первые три поля везде будут одинаковые). На выходе должен быть один или несколько документов, в зависимости от того сколько разных accountID, accountOwner, accountName найдётся.
Стоит ли вообще группировать это так или просто работать с сырым результатом программой?
Попробуйте агрегацию - group + adToSet
Illia
Попробуйте агрегацию - group + adToSet
https://www.mongodb.com/community/forums/t/how-to-group-on-multiple-columns-and-sum-up-individual-columns/4020
Нашел такое интересное применение. Решил попробовать хотя бы первых 2 шага сделать, но время ответа превысило 20-30 секунд, не знаю почему. Видимо, пока обойдусь просто .find-ом, ибо он срабатывает моментально
Игорь
Добрый, в много вообще возможно при if выполнять выражения?
Просто все что я нарыл это просто статический вывод.
Nick
Игорь
Игорь
Игорь
Просто я не совсем на тот момент не разобрался как работает $cond, спасибо за интерес к моей проблеме .
Dev
Подскажите, есть ли в монго субтранзакции? Делаю тесты, хочу каждый тест обертывать в транзакцию, чтобы октатывать все изменения после каждого теста. Но во многих функциях используются транзакции... Подскажите, как в таком случае лучше поступить?
камил
Привет, как в aggregate получить случайную запись с условием НЕ?
камил
Viktar
камил
камил
Viktar
камил
{by:123}
так мне нужно получить документ
в массиве by которого нет числа 123
камил
{by:123}
а это выдает где есть число
камил
Viktar
{by:{$ne:123}}
камил
{by:{$ne:123}}
еще вопрос
вот я добавил к 123/32
и это 32 всегда рандомное, получать из базы зная только 123?
Viktar
Не понимаю вашего вопроса. Вам надо 123 делить на какое-то то рандомное число?
камил
вроде ясно выразился
Viktar
Вы получаете весь документ. Выбирайте из него те поля которые надо.
Viktar
Или ид и Марк это одно составное поле?
камил
так, секунду
камил
в обычном python можно сделать условие:
if id in by, но это pymongo
Viktar
Viktar
И сможете искать {'by.id':123}
камил
камил
типо:
by: {id: 123, mark: 213}?
Viktar
db.collection.insertOne({id:123, mark:10})
камил
и как бы у каждого пользователя есть поле by
Viktar
Точно
камил
в него должны записываться id и оценки всех пользователей
Viktar
db.collection.insertOne({by:[{id:123, mark:10}]})