mgo(MongoDB+GO)联表查询

MongoDB.Version > 3.4

联表主要使用了MongoDB中的 Pipeline

主表(collectionMain):

mgo(MongoDB+GO)联表查询_第1张图片

从表(tableOther):

mgo(MongoDB+GO)联表查询_第2张图片

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

mgo(MongoDB+GO)联表查询_第3张图片
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 即可。
mgo(MongoDB+GO)联表查询_第4张图片

你可能感兴趣的:(Golang,MongDB)