为mongo-go-driver动态创建聚合管道

时间:2018-11-12 23:56:10

标签: mongodb go

https://godoc.org/github.com/mongodb/mongo-go-driver

我正在尝试动态创建聚合管道。例如,我想读取包含海洋的字符串片段。我试图将它们分解成碎片,但找不到任何添加元素的方法。

pipeline := bson.NewArray(
    bson.VC.DocumentFromElements(
        bson.EC.SubDocumentFromElements(
            "$match",
            bson.EC.SubDocumentFromElements("ocean",
                bson.EC.ArrayFromElements("$in",
                    bson.VC.String("Pacific Ocean"),
                    //bson.VC.String("Indian Ocean"),
                ),
            ),
            bson.EC.SubDocumentFromElements("callTypeName",
                    bson.EC.ArrayFromElements("$in",
                        bson.VC.String("Wookie"),
                        bson.VC.String("Unknown 13"),
                    ),
            ),
        ),
    ),
)
cur, err := collection.Aggregate(context.Background(), pipeline)

1 个答案:

答案 0 :(得分:2)

我认为问题很清楚,不确定第一个评论者是否真的在认真阅读声明。

此人要求的是将给定的数据列表动态地插入数据。

我的团队在一个vue应用程序上遇到了相同的问题,我正在研究。使用您提供的数据,以下是常规模板:

给出一片海洋

a := []string{"Pacific Ocean", "Indian Ocean"}

制作* bson.Value类型的大小为0的切片

b := make([]*bson.Value, 0)

在海洋切片中循环,并将bson转换后的值附加到切片b

for _, v := range a {
    b = append(b, bson.VC.String(v))
}

然后创建键值对,以便mongo可以查找匹配项

c := bson.EC.ArrayFromElements("$in", b...)

然后将c传递到管道中

pipeline := bson.NewArray(
    bson.VC.DocumentFromElements(
        bson.EC.SubDocumentFromElements(
            "$match",
            bson.EC.SubDocumentFromElements("ocean", c),
        ),
    ),
)

这应该使您了解如何动态地为callTypeNames传递管道