我试图通过聚合让用户进入某个年龄段。
编辑:我可以通过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
}
答案 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个失踪。