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:"小明","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

https://blog.csdn.net/DDKii/article/details/81504805

https://blog.csdn.net/molashaonian/article/details/86520054

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值