product表
db.product.insert({"_id":1,"productname":"商品1","price":15})
db.product.insert({"_id":2,"productname":"商品2","price":36})
orders表
db.orders.insert({"_id":1,"pid":1,"ordername":"订单1"})
db.orders.insert({"_id":2,"pid":2,"ordername":"订单2"})
db.orders.insert({"_id":3,"pid":2,"ordername":"订单3"})
db.orders.insert({"_id":4,"pid":1,"ordername":"订单4"})
orders中通过pid关联product表
left jon:
db.product.aggregate([ //注意: 这里是 db.product, 即主表名称
{
$lookup:
{
from: "orders", //注意: 这里是 orders, 需要关联的表
localField: "_id", //product表需要关联的键(主表中的key)
foreignField: "pid", //orders表中对应的键 (关联表中的key)
as: "inventory_docs" //集合名,存放关联的结果数组
}
}
])
结果:
/* 1 */
{
"_id" : 1.0,
"productname" : "商品1",
"price" : 15.0,
"inventory_docs" : [
{
"_id" : 1.0,
"pid" : 1.0,
"ordername" : "订单1"
},
{
"_id" : 4.0,
"pid" : 1.0,
"ordername" : "订单4"
}
]
}
/* 2 */
{
"_id" : 2.0,
"productname" : "商品2",
"price" : 36.0,
"inventory_docs" : [
{
"_id" : 2.0,
"pid" : 2.0,
"ordername" : "订单2"
},
{
"_id" : 3.0,
"pid" : 2.0,
"ordername" : "订单3"
}
]
}
-----------------------------------
加入查询条件: 产品 price > 20 的订单
db.product.aggregate([
{
$lookup:
{
from: "orders",
localField: "_id",
foreignField: "pid",
as: "inventory_docs"
}
},
{ $match : { price : {$gt:20} } }
])
其他举例: {$match:{name:"小明","orders.xxx":"jjj"}}
-----------------------------------
使用$project来指定我要获取的字段,比如我只需要inventory_docs字段就可以了
db.product.aggregate([
{
$lookup:
{
from: "orders",
localField: "_id",
foreignField: "pid",
as: "inventory_docs"
}
},
{ $match : { price : {$gt:20} } },
{$project:{"inventory_docs":1,"_id":0}}
])
-----------------------------------
多表关联:
$match为条件拼接,若条件为关联表中的字段,则需要根据关联表相应的结果集(as)属性后面名称拿到<例:as:“result”,获取字段为result._id>,若为主表字段条件则直接写就可以
增加排序分页功能
分页功能和排序功能只需要在关联的的aggregation中添加就可以实现,其中pageEntity.getPage()为分页的页码,pageEntity.getLimit()为条数
使用$unwind将数据打散:
db.product.aggregate([ //注意: 这里是 db.product, 即主表名称
{
$lookup:
{
from: "orders", //注意: 这里是 orders, 需要关联的表
localField: "_id", //product表需要关联的键(主表中的key)
foreignField: "pid", //orders表中对应的键 (关联表中的key)
as: "inventory_docs" //集合名,存放关联的结果数组
},
{$unwind:"$inventory_docs"}
}
])
inventory_docs 中本来存放的是一个数组, $unwind:"inventory_docs" 将查询结果分成多条, inventory_docs变成一个对象
---------------------------------
ps:一些小坑
$lookup是如果涉及关联"_id",注意两个字段的类型,用string类型匹配ObjectId类型是没有结果的~~
_class字段也是有些作用的,比如说使用$sum时用作分组
数据处理后续:Document返回的值,如果用作前端返回,ObjectId是会被当成BSON解析的~
https://blog.csdn.net/harleylau/article/details/77899223
https://blog.csdn.net/qq_38145375/article/details/95347426