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小时内删除。
留言与评论(共有 0 条评论) |