MongoDB Aggregate для заполнения массива там, где нет результатов
Упрощение дела, у меня есть следующие коллекции:
db.emails.find()
{ "_id" : ObjectId("5b59db643fd217eb78b1eb6d"), "title" : "abc" }
{ "_id" : ObjectId("5b59db643fd217eb78b1eb6e"), "title" : "def" }
а также
db.users.find()
{ "_id" : ObjectId("5b59dbab3fd217eb78b1eb70"), "name" : "john", "forwarded" : [ObjectId("5b59db643fd217eb78b1eb6d")] }
{ "_id" : ObjectId("5b59dbac3fd217eb78b1eb71"), "name" : "mary", "forwarded" : [ObjectId("5b59db643fd217eb78b1eb6e")] }
где этот перенаправленный столбец означает все электронные письма, которые уже были пересланы данному пользователю.
Мне нужно создать что-то вроде этого:
{ "_id" : ObjectId("5b59dbab3fd217eb78b1eb70"), "name" : "john", "forwarded" : [ {_id: ObjectId("5b59db643fd217eb78b1eb6d"), title: "abc"}], "not_forwarded" : [ {_id: ObjectId("5b59db643fd217eb78b1eb6e"), title: "abc"}] }
{ "_id" : ObjectId("5b59dbac3fd217eb78b1eb71"), "name" : "mary", "forwarded" : [ { _id: ObjectId("5b59db643fd217eb78b1eb6e"), title: "def" }], "not_forwarded" : [ { _id: ObjectId("5b59db643fd217eb78b1eb6d"), title: "def" }] }
Используя агрегат.
До сих пор мне удавалось создавать "перенаправленные" отображения деталей, но я все еще пытаюсь создать отображение "not_forwarded".
Я слишком большой нуб в мире noSQL, чтобы делать это простое "внешнее соединение".
Как я уже сказал, для "перенаправленного" отображения это было легко. Я создал что-то вроде этого:
db.users.aggregate([
{ $lookup: { from: "emails", localField: "forwarded", foreignField: "_id", as: "forwarded"}},
{ $project: { "email_ids._id": 0, "email_ids.tile": 0}}
]);
Теперь я пытаюсь добавить часть "not_forwarded", добавив некоторую функцию $match, где (я думаю) это будет агрегат $nin, чтобы заполнить внутри массива not_forwarded все еще не отправленные элементы,
... и вот где я с треском проваливаюсь.
Или, проще говоря, я пытаюсь найти запрос, который будет обрабатывать все электронные письма, которые еще не были пересланы пользователям в БД.
До сегодняшнего дня я делал это, создавая циклы javascript, сначала в наборе записей электронных писем, а затем вкладывая их внутрь, просматривая всех пользователей. Затем создайте новый набор записей со всеми ожидающими отправлениями электронными письмами.
Это уродливо и не перформативно. Я бы очень хотел воспользоваться всеми преимуществами этого агрегатного механизма, чтобы получить эти результаты.