Nick
мерж норм
Nick
спасибо
https://play.db-ai.co/m/XcvafnFumAAB8J6u/edit?key=KXl9JmAFKX4
второая часть где merged делается то что вам нужно
Dmitry
да, я уже пробую на своей бд, понял в чем ошибка у меня была.
Большое спасибо!
Dmitry
всем на работе вступить посоветую в группу )
yopp
Nick
прост первое что выше предлагал
Nick
или ты про что
yopp
Я же уже ссылку дал. $reduce все-же для других задач немного. А просто трансформировать массив это классика для $map
Nick
https://play.db-ai.co/m/XcvafnFumAAB8J6u
Nick
не ту ссылкку кидал
Hopf
Скажите, в монге есть возможность узнать когда была создан документ, если в нем нет поля `created_at` ?
yopp
точно нет. косвенно через _id
λ
@dd_bb а есть способ сделать запрос с обох коллекций и склеить?
yopp
$lookup или $facet
λ
У меня 2 коллекции с одинаковыми ID
yopp
зависит от того что вы хотите
Hopf
h1dw0w
а какую фразу загуглить?
https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/#ObjectId.getTimestamp
Hopf
λ
С игнором некоторых полей… (creationDate)
yopp
yopp
в контексте драйвера это работать не будет
yopp
https://jira.mongodb.org/browse/SERVER-9406
yopp
но эффективнее будет явно добаить created_at для новых документа, а в старых один раз вытащить из _id
λ
Придумал. Буду тянуть стримом с обох коллекций, и кешировать елементы, если ID не совпадет.
λ
😅
yopp
λ
Он медленный
yopp
с чего вдруг
λ
Будет бегать по всей коллекции, если не найдет
yopp
кто вам такое сказал
yopp
это просто вложенный запрос, у него ровно такой-же курсор как у обычной агрегации
λ
Я проверял - долго работает и неудобно строит ответ
yopp
¯\_(ツ)_/¯
yopp
значит вы не точно объясняете свою задачу
λ
Ну так вот он же на каждый елемент будет делать запрос, верно?
yopp
или вам нужен $facet
yopp
λ
У меня 2 разных коллекции. Но _id у документов одинаковые.
yopp
и?
yopp
вы ожидаемый результат опишите
yopp
не понятно какая ваша конечная цель
λ
Если кодом - то я запрошу и там и там и попрошу отсортировать по _id, а вотом буду брать поелементно.
λ
Давайте попробую с чистого листа.
yopp
какую задачу вы хотите решить?
yopp
на входе у вас есть две коллекции и они пересекаются каким-то идентификатором, это я уже понял
yopp
а что вы на выходе то хотите получить?
λ
Collection articles:
{
"_id": 1,
"title": "Foo baz"
}
{
"_id": 2,
"title": "Foo bar"
}
Collection images:
{
"_id": 1,
"images": [
{"_id": UUID()},
{"_id": UUID()}
]
}
{
"_id": 2,
"images": []
}
λ
А получить:
{
"_id": 1,
"title": "Foo baz",
"images": [
{"_id": UUID()},
{"_id": UUID()}
]
}
{
"_id": 2,
"title": "Foo bar",
"images": []
}
yopp
это $lookup
λ
Это lookup + unwind + group?
yopp
это просто $lookup
yopp
у вас какая-то странная денормализация
yopp
на входе у вас есть две коллекции, вы хотите одну пересечь с другой по общему идентификатору. это тот самый left join
yopp
а это $lookup
yopp
но если у вас images реально просто массив uuid, и их там не сотни килобайт и они вам постоянно нужны, то images проще положить в articles
λ
λ
Так получается "паразитное" поле с масивом images, как тогда правильно?
db.getCollection('articles').aggregate([
{
$lookup: {
from: 'articleImages',
localField: '_id',
foreignField: '_id',
as: 'images'
}
}
])
yopp
да
yopp
что такое «паразитное»?
Josh
симбиотное скорее тогда
yopp
документные хранилища позволяют вам тонко настроить степень денормализации.
а это это трейдоф между «дорого записывать» в случае сильной денормализации и «дорого читать» в случае с 1 нормальной формой
yopp
что вам подходит никто кроме вас не знает
yopp
если у вас много записи и мало чтения, то нормальная форма вероятно будет дешевле, если у вас много чтения и мало записи, то денормализация вероятно будет выгоднее
λ
Мне неудобно хранить "развернутые" "images" изза того, что они обычно запрашиваются все. Ооочень редко туда что-то добавляется/изменяется/удаляется
λ
Вот потому так…
λ
В котором опять находятся images
yopp
если изменения редкие и вы всегда читаете и статьи и картинки то вам не нужна вторая коллекция
λ
{
"_id": 1,
"title": "Foo baz",
"images" : [
{
"_id" : 1,
"images" : [ {UUID()}, {UUID()}]
}
]
}
yopp
да
yopp
но не вижу зачем ещё раз вложит images внутрь
yopp
если можно сразу просто images: [ UUID ] в корень
yopp
у вас и так _id сквозные
λ
Часто нужны статьи без картинок. А все говорят документы в монге - чем меньше размером тем быстрее
yopp
не слушайте что говорят
λ
Ну и еще (мелочь конечно) это разные компоненты в приложении.
yopp