如何在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”
答案 0 :(得分:0)
您应该使用聚合管道来连接两个集合并选择所需的数据。我在这里假设您拥有名为_id
的适当身份字段,而不是示例中的ObjectId
和Id
:
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阶段。之所以需要它,是因为您的查询将以数组形式返回新加入的字段(尽管有一个元素),因此您需要使用它来消除方括号。