首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有引用集合的Mongodb聚合

带有引用集合的Mongodb聚合
EN

Stack Overflow用户
提问于 2017-11-27 09:01:55
回答 1查看 45关注 0票数 0

我想得到我的第二级会员用户的列表,我设计的集合如下

用户

代码语言:javascript
复制
{ 
    "_id" : ObjectId("5a1b9df7bfdbfef2d4f1e9f3"), 
    "name" : "name 1",
    "affKey" : "H1g-CfFxG", 
}
{ 
    "_id" : ObjectId("5a1bce5e9a2918f71a9ac4fb"), 
    "name" : "name 2",
    "affKey" : "K1gKJfFxG", 
}

粘粒

代码语言:javascript
复制
{  
    "affKey" : "H1g-CfFxG", 
    "affUsers" : [ 
        ObjectId("5a1bce5e9a2918f71a9ac4fb")
    ], 
}

{  
    "affKey" : "K1gKJfFxG", 
    "affUsers" : [
        ObjectId("5a1b9e43bfdbfef2d4f1e9f8"),
        ObjectId("5a1b9e43bfdbfef2d4f1e911"),
    ], 
}

在这里,我将在affiliate.affKey中保存一套新的基于Users.affKey的集合

现在我想得到我的第一级和第二级附属公司的列表,即5a1b9e43bfdbfef2d4f1e9f65a1bce5e9a2918f71a9ac4fb以及一级附属机构的子公司列表。

期待这样的结果

代码语言:javascript
复制
{
  first: [first level affiliates] // 1 result 
  second: [second level affiliates] // 2 results
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-27 10:10:32

对于这种情况,您必须采取一些步骤才能得到预期的结果。可以跟随下面的步骤

  1. $lookup用于affKeyaffiliets集合
  2. 然后,您必须对$lookup集合进行users以获取引用用户信息。
  3. 之后,您必须再次$lookup第二级用户affKeyaffiliets集合。

所以查询可以像下面这样

代码语言:javascript
复制
db.users.aggregate([
  {
    $lookup: {
      from: "affilites",
      localField: "affKey",
      foreignField: "affKey",
      as: "affUsers"
    }
  },
  {
    $project: {
      name: 1,
      affKey: 1,
      first: {$arrayElemAt: ["$affUsers.affUsers", 0]},
      secondLevelUserId: {$arrayElemAt: ["$affUsers.affUsers", 0]}
    }
  },
  { $unwind: { path: "$secondLevelUserId", "preserveNullAndEmptyArrays": true }},
  {
    $lookup: {
      from: "users",
      localField: "secondLevelUserId",
      foreignField: "_id",
      as: "secondLevelUser"
    }
  },
  {
    $project: {
      name: 1,
      affKey: 1,
      first: 1,
      secondLevelUser: {$arrayElemAt: ["$secondLevelUser", 0]}
    }
  },
  {
    $lookup: {
      from: "affilites",
      localField: "secondLevelUser.affKey",
      foreignField: "affKey",
      as: "secondLevelUser"
    }
  },
  {
    $project: {
      name: 1,
      affKey: 1,
      first: 1,
      second: {$arrayElemAt: ["$secondLevelUser.affUsers", 0]}
    }
  },
  {
    $unwind: {
      "path": "$second",
      "preserveNullAndEmptyArrays": true
    }
  },
  {
    $group: {
      _id: "$_id",
      name: {$first: "$name"},
      affKey: {$first: "$affKey"},
      first: {$first: "$first"},
      second: {$addToSet: "$second"}
    }
  }
]);

执行查询后,您将得到如下结果

第一份文件:

代码语言:javascript
复制
{
    "_id" : ObjectId("5a1b9df7bfdbfef2d4f1e9f3"),
    "name" : "name 1",
    "affKey" : "H1g-CfFxG",
    "first" : [ 
        ObjectId("5a1bce5e9a2918f71a9ac4fb")
    ],
    "second" : [ 
        ObjectId("5a1b9e43bfdbfef2d4f1e911"), 
        ObjectId("5a1b9e43bfdbfef2d4f1e9f8")
    ]
}

第二份文件

代码语言:javascript
复制
{
    "_id" : ObjectId("5a1bce5e9a2918f71a9ac4fb"),
    "name" : "name 2",
    "affKey" : "K1gKJfFxG",
    "first" : [ 
        ObjectId("5a1b9e43bfdbfef2d4f1e9f8"), 
        ObjectId("5a1b9e43bfdbfef2d4f1e911")
    ],
    "second" : []
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47507109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档