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 即可。
发表评论 取消回复