使用 Golang/Mongodb 聚合给出错误“复合文字中缺少类型”

我试图通过聚合让用户处于某个年龄段。


编辑:我能够通过 mongo shell 工作,查询工作正常但是我无法让它与 go 一起工作


这段代码给了我“复合文字中缺少类型”的错误。


我在这里错过了什么?


lte := 10

gte := 0


operations := []bson.M{

    {

        "$match":{

            "$and":[]interface{}{

                bson.M{"age":{"$gte":gte}},

                bson.M{"age":{"$lte":lte}},

            },

        },

    },

    {

        "$group":bson.M{"_id":"$user_id"},

    },


}


r := []bson.M{}


pipe := c.Pipe(operations)

err := pipe.All(&r)

if err != nil {

    logrus.Errorf("Error:  %v", err)

    return err

}


小唯快跑啊
浏览 192回答 2
2回答

MYYA

您尚未将“每个”管道阶段定义为bson.M. 它是 的“数组” bson.M,因此出现错误:operations := []bson.M{    bson.M{        "$match": bson.M{            "date": bson.M{ "$gte": gte, "$lte": lte }        }    },    bson.M{        "group": bson.M{ "_id": "$user_id" }    }}也$and没有必要。无论如何,所有MongoDB 查询条件都已经是“AND”表达式。$gte和$lte作为同一对象表达式中的键的组合已经是同一"date"属性上的 AND 条件。就像在$match对象中添加更多键一样。在 JavaScript shell 中,这与以下内容相同:var operations = [    { "$match": { "date": { "$gte": gte, "$lte": lte } } },    { "$group": { "_id": "$user_id" } }];所以你需要记住,每个 JavaScript 对象表示法都{}等于一个.bson.M{}语句。这就是你在这个库中标记 BSON 对象的方式。注意: { "$group": { "_id": "$user_id } }除了返回每个“不同”的"user_id"值外,不会做任何有意义的事情。因此,您可能希望在任何实际结果中都有更多的累加器选项

沧海一幻觉

我相信这就是你想要的:operations := []bson.M{    bson.M{        "$match":bson.M{            "$and":[]interface{}{                bson.M{"age":bson.M{"$gte":gte}},                bson.M{"age":bson.M{"$lte":lte}},            },        },    },    bson.M{        "$group":bson.M{"_id":"$user_id"},    },}你只是在“$and”之前忘记了 bson.M 。编辑:看起来也很古老,我继续修复了这些。编辑 2:我错过的 bson.M 比我看到的最初 3 个错过的要多。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go