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

时间:2016-03-21 22:40:21

标签: mongodb go mongodb-query

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

编辑:我可以通过mongo shell工作,查询工作正常但是我无法使其工作

  

此代码为我提供了“复合文字中缺少类型”错误。

我在这里缺少什么?

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
}

2 个答案:

答案 0 :(得分:3)

您尚未定义"每个"管道阶段为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 } }除了返回每个" distinct"之外不会做任何有意义的事情。 "user_id"值。DrawDriver因此,您可能希望在任何实际结果中有更多accumulator options

答案 1 :(得分:-1)

我相信这就是你想要的:

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。

编辑:看起来也像年龄一样,我继续修复它们。

Edit2 :我错过了bson.M,而不是我看到的最初3个失踪。