mgo(MongoDB+GO)联表查询

MongoDB.Version > 3.4

联表主要使用了MongoDB中的 Pipeline

主表(collectionMain):

ZdafT1.png

从表(tableOther):

ZdabOH.png

使用主表的序号列和从表的序号列进行左联,结果(collectionDst):

Zd0QoR.png
MongoDB语法其实很简单,但是GO中需要使用bson,就变得油腻了起来。

pipe := collectionMain.Pipe([]bson.M{

		{
			"$lookup": bson.M{
				"from":         tableOther,
				"localField":   ColumnMain,
				"foreignField": ColumnOther,
				"as":           "union",
			},
		},
		{
			"$replaceRoot": bson.M{
				"newRoot": bson.M{
					"$mergeObjects": []interface{}{
						bson.M{"$arrayElemAt": []interface{}{"$union", 0}},
						"$$ROOT",
					},
				},
			},
		},

		{"$project": bson.M{
			"union":     0,
			"_id":       0,
			ColumnOther: 0,
		}},
	})
	var data []interface{}
	err := pipe.All(&data)
	if err != nil {
		return err
	}
	if len(data) >= 1 {
		for _, d := range data {
		 	collectionDst.Insert(d)
    	}
    }

$lookup:左联表字段

  • from:需要连接的集合(tableOther)
  • localField:在输入文档(collectionMain)中的查找字段
  • foreignField:需要在from集合中查找的字段
  • as:输出的字段名字,可任你更改

$replaceRoot:该操作替换输入文档中的所有现有字段,包括_id字段。可以将现有的嵌入式文档提升到顶层,或者创建一个新文档进行提升。

$mergeObjects:将多个文档合并到一个文档中。

$arrayElemAt:返回指定数组索引处的元素

$project:将带有请求字段的文档传递到管道中的下一阶段。指定的字段可以是输入文档中的现有字段,也可以是新计算的字段。

若需要n表联表,添加 n-1$lookup 即可。
ZcjKr4.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值