Nick
мерж норм
Nick
спасибо
https://play.db-ai.co/m/XcvafnFumAAB8J6u/edit?key=KXl9JmAFKX4 второая часть где merged делается то что вам нужно
Dmitry
да, я уже пробую на своей бд, понял в чем ошибка у меня была. Большое спасибо!
Dmitry
всем на работе вступить посоветую в группу )
yopp
https://play.db-ai.co/m/XcvafnFumAAB8J6u/edit?key=KXl9JmAFKX4
Зачем так сложно если $map есть
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
точно нет. косвенно через _id
а какую фразу загуглить?
h1dw0w
а какую фразу загуглить?
https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/#ObjectId.getTimestamp
λ
зависит от того что вы хотите
Просто склеить данные с одним ID с обох коллекций
yopp
а какую фразу загуглить?
objectid to date у аси было несколько раз
λ
С игнором некоторых полей… (creationDate)
yopp
https://docs.mongodb.com/manual/reference/method/ObjectId.getTimestamp/#ObjectId.getTimestamp
это работает только к контексте mongo-shell
yopp
в контексте драйвера это работать не будет
yopp
https://jira.mongodb.org/browse/SERVER-9406
yopp
но эффективнее будет явно добаить created_at для новых документа, а в старых один раз вытащить из _id
λ
Придумал. Буду тянуть стримом с обох коллекций, и кешировать елементы, если ID не совпадет.
λ
😅
λ
Он медленный
yopp
с чего вдруг
λ
Будет бегать по всей коллекции, если не найдет
yopp
кто вам такое сказал
yopp
это просто вложенный запрос, у него ровно такой-же курсор как у обычной агрегации
λ
Я проверял - долго работает и неудобно строит ответ
yopp
¯\_(ツ)_/¯
yopp
значит вы не точно объясняете свою задачу
λ
Ну так вот он же на каждый елемент будет делать запрос, верно?
yopp
или вам нужен $facet
λ
У меня 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 с одним найденным елементом (или и вовсе без)
λ
В котором опять находятся images
yopp
если изменения редкие и вы всегда читаете и статьи и картинки то вам не нужна вторая коллекция
λ
{ "_id": 1, "title": "Foo baz", "images" : [ { "_id" : 1, "images" : [ {UUID()}, {UUID()}] } ] }
yopp
да
yopp
но не вижу зачем ещё раз вложит images внутрь
yopp
если можно сразу просто images: [ UUID ] в корень
yopp
у вас и так _id сквозные
λ
Часто нужны статьи без картинок. А все говорят документы в монге - чем меньше размером тем быстрее
yopp
не слушайте что говорят
λ
Ну и еще (мелочь конечно) это разные компоненты в приложении.