MongoDB聚合以填充结果不在其中的数组

时间:2018-07-27 15:24:59

标签: mongodb-query aggregation-framework nosql-aggregation

为简化起见,我有以下收藏:

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}}
]);

现在,我试图通过添加一些$ match函数来添加“ not_forwarded”部分,其中(我想)该子句将是一个$ nin聚合,以填充“ not_forwarded”数组内部,而并非尚未发送邮件。

...那是我惨败的地方。

或更简单地说,我正在尝试提出一个查询,该查询将呈现尚未转发给数据库中用户的所有电子邮件。

直到今天,我一直通过进行javascript循环来实现它,首先是在电子邮件的记录集中,然后嵌套在其中,并遍历所有用户。然后使用所有待发送的电子邮件创建一个新的记录集。

这是丑陋的,没有表现力。我非常想充分利用这种聚合机制来获得这些结果。

0 个答案:

没有答案