Mongodb 如何使用golang翻译此mongo查询cmd

Mongodb 如何使用golang翻译此mongo查询cmd,mongodb,go,Mongodb,Go,我使用“gopkg.in/mgo.v2”作为Go的mongo驱动程序 我试着翻译这个查询: db.demo.aggregate([ {$group:{_id:"$name", a:{$sum:"$a"}, b:{$sum:"$b"}}}, {$project:{name:1,a:1,b:1,_id:1,bdiva:{$cond:[{$eq:["$a",0]},0,{$divide:["$b","$a"]}]}}}, {$sort:{bdiva:1}} ]) 但是我无法获得bd

我使用“gopkg.in/mgo.v2”作为Go的mongo驱动程序 我试着翻译这个查询:

db.demo.aggregate([ 
{$group:{_id:"$name",
    a:{$sum:"$a"},
    b:{$sum:"$b"}}},
{$project:{name:1,a:1,b:1,_id:1,bdiva:{$cond:[{$eq:["$a",0]},0,{$divide:["$b","$a"]}]}}},
{$sort:{bdiva:1}}
])
但是我无法获得bdiva正确,我应该如何修复它? ------我试过的---- 我在shell中执行cmd并得到结果: 字段bdiva被输出, 但当我运行go代码时,它只输出:

字段bdiva缺失,为什么

完整代码:

project := bson.M{
    "$project": bson.M{
        "name": true, "a": true, "b": true,  "_id": true,
        "bdiva": bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"$a", 0}}, 0, bson.M{"$divide": []interface{}{"$b", "$a"}}}},

    },
}

group := bson.M{
    "$group": bson.M{
        "_id":  "$name",
        "a":    bson.M{"$sum": "$a"},
        "b":    bson.M{"$sum": "$b"},
    },
}

sort := bson.M{
    "$sort": bson.M{
        "bdiva": 1,
    },
}
func aggregatequalydemo(){
println(“/”)
}

查询条件编写正确,值得注意:

  • 要写入$eq条件,应在go中使用接口切片
  • 操作顺序很重要,要解决问题的问题,应该

    操作:=[]bson.M{组、项目、排序}


  • 谢谢

    怎么了?我真正看到的是元素的顺序是颠倒的,所以
    [“$a”,“$b”]
    而不是
    [“$b”,“$a”]
    。当然,您可以继续使用“
    $cond
    ”包装“除以零”检查,但一旦您计算出其中一部分,就不难获得其余部分。对不起,我的错误,代码已更新。我将一步一步地尝试。您可以更具描述性。您真的在问吗?”如何在数组元素中混合BSON类型和整型/双倍值?“如果您不确定如何构造
    $cond
    ,这将更加直接。不过,表面上看它看起来是正确的,所以我不确定这里的问题是什么。添加了更多详细信息。这不是
    操作:=[]BSON.m吗{group,project,sort}
    您有不同顺序的阶段,因此,
    $project
    的结果无法通过。
    func AggregateQueryDemo() {
        println("//<<-------------------------AggregateQueryDemo start-----------")
        start := time.Now()
    
        session, err := mgo.Dial(ADDRESSPORT)
        if err != nil {
            return
        }
        defer session.Close()
        c := session.DB(DB).C(COLLECTION)
    
        project := bson.M{
            "$project": bson.M{
                "name": true, "a": true, "b": true, "suma": true, "sumb": true, "_id": true,
                "bdiva": bson.M{"$cond": []interface{}{bson.M{"$eq": []interface{}{"$suma", 0}}, 0, bson.M{"$divide": []interface{}{"$sumb", "$suma"}}}},
            },
        }
    
        group := bson.M{
            "$group": bson.M{
                "_id":  "$name",
                "sumb": bson.M{"$sum": "$b"},
                "suma": bson.M{"$sum": "$a"},
            },
        }
    
        sort := bson.M{
            "$sort": bson.M{
                "bdiva": 1,
            },
        }
    
        operations := []bson.M{project, group, sort}
        pipe := c.Pipe(operations)
    
        ret := []interface {
        }{}
        err = pipe.All(&ret)
        if err != nil {
            panic(err.Error())
            return
        }
        for k, v := range ret {
            fmt.Printf("%+v: %+v\n", k, v)
        }
        fmt.Printf(" %v microseconds\n", time.Since(start)/1000000)
        println("//---------------------------AggregateQueryDemo end----------->>")
    }