【问题标题】:Aggregation With Golang/Mongodb Gives Error "Missing type in composite literal"使用 Golang/Mongodb 进行聚合给出错误“复合文字中缺少类型”
【发布时间】:2016-07-08 16:00:11
【问题描述】:

我正在尝试通过聚合来吸引特定年龄段的用户。

编辑:我能够通过 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
}

【问题讨论】:

  • 您按 user_id 分组,但我看不到您在哪里选择它作为结果值
  • 请添加示例文档by editing your question
  • @obi1 我不确定我明白,你能详细说明吗?
  • @MarkusWMahlberg,我的问题是由于此代码无法编译而出现的。我不知道你为什么需要一个示例文档。
  • @ceroloy 只是为了确保您确实确​​实有一个名为user_id 的字段并防止冗长的讨论。 ;)

标签: mongodb go mongodb-query


【解决方案1】:

您尚未将“每个”管道阶段定义为 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" }
    }
}

也不需要$andALL 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" 值。所以你可能想要更多的accumulator options 在任何实际结果中

【讨论】:

  • 不幸的是它没有用。我试图在给定的年龄范围内获得不同的用户,这就是我使用组的原因?这也是一个错误吗?
  • @cemre 你问的问题是关于你所拥有的表达式的复合文字。我给了你一个解决这个问题的解决方案。我还回滚了您的问题修订,因为那非常粗鲁。这不是一个线程讨论。你问一个问题,有人回答,然后你接受它继续前进。如果您还有其他问题,那么Ask another question。不要在此处更改您最初提出的问题。人们很友善地回答,所以请回来。
  • 另外,没有你的回答并没有解决我的问题,因为你修改了条件部分。我最初是想了解如何在查询中使用条件,而您的回答只是删除了我要学习的部分。
【解决方案2】:

我相信这就是你想要的:

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 个丢失的要多。

【讨论】:

  • 它错过了不止一个bson.M,这又根本无法编译,并且没有注意到$and 是完全没有必要的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 2021-04-28
  • 2020-05-12
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多