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, сначала в наборе записей электронных писем, а затем вкладывая их внутрь, просматривая всех пользователей. Затем создайте новый набор записей со всеми ожидающими отправлениями электронными письмами.

Это уродливо и не перформативно. Я бы очень хотел воспользоваться всеми преимуществами этого агрегатного механизма, чтобы получить эти результаты.

0 ответов

Другие вопросы по тегам