MongoDB.Version > 3.4


联表主要使用了MongoDB中的 Pipeline


主表(collectionMain):




从表(tableOther):




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



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 即可。


点赞(1891)

评论列表共有 0 条评论

立即
投稿
返回
顶部