如何使用联接在MongoDB数据库中查找数据?

时间:2018-12-18 11:40:05

标签: mongodb

如何在mongodb中加入架构?

示例:

收藏

{ 
 ObjectId : ObjectId("ABCDE")
 userName : "Jason",
 level : 30,
 money : 200
}

b收藏

{
   Id : ObjectId("AAACC"),
   userId : ObjectId("ABCDE"),
   item : "sword"
}

b.aggregate ....

我想要的结果是 id:ObjectId(“ AAACC”),用户名:“ Jason”,项目:“ sword”

2 个答案:

答案 0 :(得分:0)

您应该使用聚合管道来连接两个集合并选择所需的数据。我在这里假设您拥有名为_id的适当身份字段,而不是示例中的ObjectIdId

db.items.aggregate([
 {   
   $lookup:
   {
      from: "users",
      localField: "userId",
      foreignField: "_id", // ObjectId in your sample
      as: "user"
   }
 },
 { $unwind: "$user" },
 { 
   $project:
   {
      "item": 1,
      "userName": "$user.userName"
      // Id: 1 if you will use your names, because only _id is selected by default
   }
  }
])

第一步是lookup,它在userId字段等于用户集合中的_id字段上加入 users 集合。

那么您应该unwind结果,因为查找会将所有匹配的用户作为用户文档的数组放置在user字段中。

最后一步-project将结果文档转换为所需格式。


现在是样品。如果您在集合中有以下文档:

{
    "_id" : ObjectId("5c18df3e5d85eb27052a599c"),
    "item" : "sword",
    "userId" : ObjectId("5c18ded45d85eb27052a5988")
},    
{
    "_id" : ObjectId("5c18df4f5d85eb27052a599e"),
    "item" : "helmet",
    "userId" : ObjectId("5c18ded45d85eb27052a5988")
},
{
    "_id" : ObjectId("5c18e2da5d85eb27052a59ee"),
    "item" : "helmet"
}

您有两个用户:

{
    "_id" : ObjectId("5c18ded45d85eb27052a5988"),
    "userName" : "Jason",
    "level" : 30,
    "money" : 200
},
{
    "_id" : ObjectId("5c18dee35d85eb27052a598a"),
    "userName" : "Bob",
    "level" : 70,
    "money" : 500
}

然后上面的查询将产生

{
    "_id" : ObjectId("5c18df3e5d85eb27052a599c"),
    "item" : "sword",
    "userName" : "Jason"
},
{
    "_id" : ObjectId("5c18df4f5d85eb27052a599e"),
    "item" : "helmet",
    "userName" : "Jason"
},
{
    "_id" : ObjectId("5c18e2da5d85eb27052a59ee"),
    "item" : "helmet"
}

注意:通常,用户名应该是唯一的。考虑使用它们作为 users 集合的标识。这也将在没有任何连接的 items 集合中为您提供所需的结果。

答案 1 :(得分:0)

您可以使用lookup聚合运算符来加入两个集合,然后仅project仅使用集合a中您感兴趣的字段:

db.b.aggregate([
{
  $lookup: {
      from: "a",
      localField: "userId",
      foreignField: "ObjectId",
      as: "user"
  }
},
{
  $unwind: "$user"
},
{
  $project: {
    Id: 1
    userName: "$user.userName",
    item: 1
  }
}
]);

我假设a.ObjectId实际上应该被称为a._id,而b.Id应该是b._id?无论哪种方式,都适用相同的原理。

编辑:忘记了unwind阶段。之所以需要它,是因为您的查询将以数组形式返回新加入的字段(尽管有一个元素),因此您需要使用它来消除方括号。