mongodb lookup (left join) 总结

阅读: 评论:0

mongodb  lookup (left join) 总结

mongodb lookup (left join) 总结

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:"小明",&#":"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中添加就可以实现,其中Page()为分页的页码&#Limit()为条数 

使用$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解析的~ 

 

 

 

本文发布于:2024-01-31 12:23:29,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170667501228490.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:lookup   mongodb   join   left
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23