Mongodb 如何使用golang翻译此mongo查询cmd
我使用“gopkg.in/mgo.v2”作为Go的mongo驱动程序 我试着翻译这个查询: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
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(“/”)
}
查询条件编写正确,值得注意:
谢谢怎么了?我真正看到的是元素的顺序是颠倒的,所以
[“$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----------->>")
}