MongoD实现一对多、多对多查询

2,530 阅读1分钟
原文链接: github.com

MongoDB's $lookup Aggregator

一对多

先创建一张表`countryCode`

db.countryCode.insert([{code: 1}, {code: 20}, {code: 30}])

第二张表`countryCodeLookup`,这张表显示country的code和country的name 的对应关系

db.countryCodeLookup.insert([{code: 1, name: "United States"}, {code: 20, name: "Egypt"}, 
{code: 1, name: "Foobar"}, {code: 30, name: "Greece"}])

下面通过 $lookup 操作符连接两个集合,其中 $project 会过滤属性

db.countryCode.aggregate([
{ $lookup: {from: "countryCodeLookup", localField: "code", foreignField: "code", as: "countryName"} },
{ $project: {"code":1, "countryName.name":1, "_id":0} }
])

$match 会查询连接后的表,显示符合条件的。

db.countryCode.aggregate([
{ $lookup: {from: "countryCodeLookup", localField: "code", foreignField: "code", as: "countryName"} },
{ $project: {"code":1, "countryName.name":1, "_id":0} },
{ $match:{"code":1.0}}
])

一对一

$unwind操作符会分解$lookup中的as数组,使之扁平化返回。

db.countryCode.aggregate([
{ $lookup: {from: "countryCodeLookup", localField: "code", foreignField: "code", as: "countryName"} },
{ $project: {"code":1, "countryName.name":1, "_id":0} },
{ $unwind: "$countryName"},
{ $match:{"code":1.0}}
])

现在countryName是一个子文档,在project中设置把子文档中的属性拿出来,这里$project要在$unwind属性后面。

db.countryCode.aggregate([
{ $lookup: {from: "countryCodeLookup", localField: "code", foreignField: "code", as: "countryName"} },
{ $unwind: "$countryName"},
{ $project: {"code":1, "name": "$countryName.name", "_id":0} }
])