为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
小唯快跑啊 2021-12-27 15:20:43
我试图通过聚合让用户处于某个年龄段。编辑:我能够通过 mongo shell 工作,查询工作正常但是我无法让它与 go 一起工作这段代码给了我“复合文字中缺少类型”的错误。我在这里错过了什么?lte := 10gte := 0operations := []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}
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

您尚未将“每个”管道阶段定义为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"值外,不会做任何有意义的事情。因此,您可能希望在任何实际结果中都有更多的累加器选项


查看完整回答
反对 回复 2021-12-27
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

我相信这就是你想要的:


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 个错过的要多。


查看完整回答
反对 回复 2021-12-27
  • 2 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信