我想统计一下过go 一个月里按名字分组的人数.当我try 在Golang Mongo客户端中运行以下查询时.我得到的错误是:

error:流水线阶段规范对象必须正好包含一个字段.

    cond := &bson.D{
        bson.E{Key: "$createTime", Value: bson.E{Key: "$gte", Value: time.Now().AddDate(0, -1, 0)}},
    }
    match := bson.D{{Key: "$match", Value: cond}}
    group := bson.D{{Key: "$group", Value: bson.D{
        {Key: "_id", Value: "$name"},
        {Key: "count", Value: bson.D{{Key: "$sum", Value: 1}}},
    }}}
    cursor, err := col.Aggregate(ctx, mongo.Pipeline{match, group})

我不知道该怎么办?

推荐答案

通过以下调整,我得到了想要的结果:

  • $createTime更改为createTime,我假设您的字段名称不是以$开头
  • bson.E{Key: "$gte", Value: time.Now().AddDate(0, -1, 0)}改为bson.D{{Key: "$gte", Value: time.Now().AddDate(0, -1, 0)}}
cond := &bson.D{
    bson.E{Key: "createTime", Value: bson.D{{Key: "$gte", Value: time.Now().AddDate(0, -1, 0)}}},
}
match := bson.D{{Key: "$match", Value: cond}}
group := bson.D{{Key: "$group", Value: bson.D{
    {Key: "_id", Value: "$name"},
    {Key: "count", Value: bson.D{{Key: "$sum", Value: 1}}},
}}}
cursor, err := col.Aggregate(context.TODO(), mongo.Pipeline{match, group})

if err != nil {
    log.Println("Error: ", err)
}

调试这类问题的一些提示:

  • 始终判断在err变量中返回的错误消息
  • 您可以通过以下方式启用原始数据库命令日志(log)记录:
uri := options.Client().ApplyURI(appSettings.MongoDbUri)

if appSettings.LogDatabaseCommands {
    cmdMonitor := &event.CommandMonitor{
        Started: func(_ context.Context, evt *event.CommandStartedEvent) {
            log.Print(evt.Command)
        },
    }
    uri.SetMonitor(cmdMonitor)
}

Mongodb相关问答推荐

MongoDB:从集合页面数据中提取不同的值

为什么这个查询可以在MongoDB中使用?

MongoDB 聚合使用 $match 和 $expr 和数组

MongoDB查询仅返回嵌入文档

是否可以迭代 mongo 游标两次?

findOneAndUpdate 和 findOneAndReplace 有什么区别?

在 mongoDB 中存储 java 8 LocalDate

字段类型在 MongoDB 索引中是否重要?

什么是 mongodb 中的admin数据库?

在 mongoDB 中展平嵌套的 JSON struct

从每个组中 Select 前 N 行

Mongodb:为什么 show dbs 不显示我的数据库?

NumberLong和简单整数之间的MongoDB区别?

MongoDB 范围查询中 $lt 和 $gt 的顺序

在 MongoDB 上分片 GridFS

在 mongodb 中插入当前日期时间

Mongoose Select 要从 findOneAndUpdate 返回的字段

Mongodb $lookup 使用 _id 无效果

120 个 mongodb 集合与单个集合 - 哪个更有效?

无法使用命令写入模式错误,降级到兼容模式