iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >减法聚合 Mongo 文档 Golang
  • 110
分享到

减法聚合 Mongo 文档 Golang

golang开发 2024-02-08 21:02:31 110人浏览 泡泡鱼
摘要

PHP小编子墨今天为大家介绍减法聚合 MonGo 文档 golang。在Golang开发中,使用mongoDB作为数据库是非常常见的选择。而MongoDB提供了强大的聚合框架,可以对文

PHP小编子墨今天为大家介绍减法聚合 MonGo 文档 golang。在Golang开发中,使用mongoDB作为数据库是非常常见的选择。而MongoDB提供了强大的聚合框架,可以对文档进行各种复杂的聚合操作。其中,减法聚合是一种特殊的聚合操作,可以用来计算文档中某个字段的差值。本文将详细介绍如何在Golang中使用减法聚合来处理Mongo文档,帮助开发者更好地理解和应用这一功能。

问题内容

我在 mongo 中有这个文档

{
  "_id": {
    "$oid": "649d3D688a1f30bf82e77342"
  },
  "test_value": {
    "$numberlong": "10"
  }
}

我想用这个 golang 代码将“test_value”减一

JSONInput := []map[string]interface{}{
        {
            "$match": map[string]interface{}{
                "test_value": 10,
            },
        },
        {
            "$set": map[string]interface{}{
                "test_value": map[string]interface{}{
                    "$subtract": []interface{}{"test_value", 1}},
            },
        },
    })


    value, bsonByte, errMarshal := bson.MarshalValue(jsonInput)
    if errMarshal != nil {
        modules.DoLog("ERROR", "", "MongoService", "aggregateDocument", "cannot Marshal jsonInput to BSONByte", true, errMarshal)
        ctx.IndentedJSON(200, gin.H{
            "error": errMarshal.Error(),
        })
        return
    }
    fmt.Println(value)
    
    bsonD := bson.A{}

    errUnmarshal1 := bson.UnmarshalValue(value, bsonByte, &bsonD)
    if errUnmarshal1 != nil {
        modules.DoLog("ERROR", "", "MongoService", "aggregateDocument", "cannot Unmarshal BSONByte to BSOND", true, errUnmarshal1)
        ctx.IndentedJSON(200, gin.H{
            "error": errUnmarshal1.Error(),
        })
        return
    }
    
    _, err := Client.Database("rhanov_queries").Collection(collectionName).Aggregate(ContextMongo, bsonD)
    if err != nil {
        modules.DoLog("ERROR", "", "MongoService", "aggregateDocument", "cannot aggregate document to Mongo", true, err)
        ctx.IndentedJSON(200, gin.H{
            "error": err,
        })
    }

我收到此错误

“无法将文档聚合到 mongo。无法将基元类型编组到 bson 文档:writearray 只能在位于元素或值上但位于顶层时写入数组

我做错了什么?


正确答案


"$subtract": []interface{}{"test_value", 1}

请注意,这里 "test_value" 是一个文字。该表达式的意思是从字符串test_value中减去数字1,这是无效的,不是你想要的。您想改为引用字段路径。因此,您应该在其前面加上 $ 前缀(请参阅 聚合表达式)。这是更正后的代码:

"$subtract": []interface{}{"$test_value", 1}

ps 1

为了方便其他人调查问题,请在以后提供一个最小的可执行重现器,例如:

package main

import (
    "context"
    "fmt"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
    jsoninput := []map[string]interface{}{
        {
            "$match": map[string]interface{}{
                "test_value": 10,
            },
        },
        {
            "$set": map[string]interface{}{
                "test_value": map[string]interface{}{
                    "$subtract": []interface{}{"test_value", 1},
                    // `test_value` should be prefixed with $ like this:
                    // "$subtract": []interface{}{"$test_value", 1},
                },
            },
        },
    }

    typ, buf, err := bson.marshalvalue(jsoninput)
    if err != nil {
        panic(err)
    }
    fmt.println(typ)

    var bsond bson.a

    if err := bson.unmarshalvalue(typ, buf, &bsond); err != nil {
        panic(err)
    }

    client, err := mongo.connect(context.background(), options.client().applyuri("mongodb://localhost"))
    if err != nil {
        panic(err)
    }
    collection := client.database("demo").collection("values")
    cur, err := collection.aggregate(context.background(), bsond)
    if err != nil {
        panic(err)
    }
    defer cur.close(context.background())
    for cur.next(context.background()) {
        fmt.printf("%+v", cur.current)
    }
}

并初始化收集数据:

db.values.insert({ _id: objectid('649d3d688a1f30bf82e77342'), test_value: 10 })

(在 mongodb shell 中执行)

使用软件包 go.mongodb.org/[电子邮件受保护]mongo:5.0.8,我得到的错误是:

panic: (typemismatch) failed to optimize pipeline :: caused by :: can't $subtract int from string

ps 2:

如果您不知道,您可以直接创建 bsond 变量,如下所示:

bsonD := bson.A{
    bson.M{
        "$match": bson.M{
            "test_value": 10,
        },
    },
    bson.M{
        "$set": bson.M{
            "test_value": bson.M{
                "$subtract": bson.A{"$test_value", 1},
            },
        },
    },
}

ps 3

您显示的代码存在语法错误(jsoninput 的简短声明末尾有一个额外的 ))。更正此错误后,我认为它不会导致您在问题中显示的错误。我相信错误是针对另一个 jsoninput 值。

以上就是减法聚合 Mongo 文档 Golang的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 减法聚合 Mongo 文档 Golang

本文链接: https://www.lsjlt.com/news/562041.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 减法聚合 Mongo 文档 Golang
    php小编子墨今天为大家介绍减法聚合 Mongo 文档 Golang。在Golang开发中,使用MongoDB作为数据库是非常常见的选择。而MongoDB提供了强大的聚合框架,可以对文...
    99+
    2024-02-08
    golang开发
  • Gateway+Swagger2配置聚合文档的方法是什么
    这篇文章主要介绍“Gateway+Swagger2配置聚合文档的方法是什么”,在日常操作中,相信很多人在Gateway+Swagger2配置聚合文档的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”G...
    99+
    2023-07-05
  • Spring Cloud Gateway 整合 knife4j 聚合接口文档功能
    当系统中微服务数量越来越多时,如果任由这些服务散落在各处,那么最终管理每个项目的接口文档将是一件十分麻烦的事情,单是记住所有微服务的接口文档访问地址就是一件苦差事了。当如果能够将所有...
    99+
    2024-04-02
  • 详解Mongodb 多文档聚合操作处理方法(Map-reduce 函数)
    目录聚合Map-reduce 函数示例:按客户统计示例:按日期统计聚合 聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来: 将多个文档中的值分组在一起。对分组数据执行操作以返回单个结果。分析数据随时间的变化。 要...
    99+
    2023-08-07
    Mongodb 聚合操作 Mongodb 多文档聚合操作 Mongodb Map-reduce 函数
  • 解析 mongo-go-driver 中聚合管道中的扩展 JSON 日期的方法
    有志者,事竟成!如果你在学习Golang,那么本文《解析 mongo-go-driver 中聚合管道中的扩展 JSON 日期的方法》,就很适合你!文章讲解的知识点主要包括,若是你对本文感兴趣,或者是...
    99+
    2024-04-04
  • 如何撰写符合 Golang 文档编写规范的函数文档?
    遵循以下步骤撰写符合 golang 文档编写规范的函数文档:1. 函数签名(包含函数名称、参数和返回值类型);2. 函数描述(简要描述函数功能);3. 参数(指定名称、类型和描述);4....
    99+
    2024-05-04
    go 写函数文档 golang
  • Golang无法在MongoDB中创建文档
    问题内容 我正在尝试将文档插入 mongodb,但尽管成功连接到 mongo,但我仍然收到以下错误: http: panic serving 172.27.0.8:40176: run...
    99+
    2024-02-12
  • Surge多配置文件聚合配置方法
    目录 摘要1. Surge配置原理2. Surge托管配置3. Surge多配置文件聚合配置(1)找到配置文件(2)编辑配置文件 参考 摘要 Surge 是一个在 macOS 和...
    99+
    2023-09-04
    服务器 网络
  • Golang生成Excel文档的方法步骤
    目录关于 Excelize 库 性能对比 安装 创建 Excel 文档 实际场景复现 创建工作表 删除默认创建的工作表 合并单元格 单元格样式 文字水平居中 给单元格设置纯色填充 S...
    99+
    2024-04-02
  • Golang文档乱码问题解决方法
    Golang作为一门新兴的编程语言,备受广大程序员的青睐。然而,与其他编程语言不同的是,Golang的官方文档中经常出现乱码问题,给大家的学习和使用带来了很多不便。本文将从以下几个方面探讨Golang文档乱码问题的原因和解决方法。一、原因分...
    99+
    2023-05-14
  • Golang生成Excel文档的方法是什么
    这篇文章主要介绍“Golang生成Excel文档的方法是什么”,在日常操作中,相信很多人在Golang生成Excel文档的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang生成Excel文档...
    99+
    2023-07-05
  • golang组件swagger生成接口文档的方法
    这篇文章主要介绍“golang组件swagger生成接口文档的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang组件swagger生成接口文档的方法”文章能帮助大家解决问题。swagge...
    99+
    2023-06-30
  • 如何为 Golang 函数文档撰写合乎逻辑的函数签名?
    编写合乎逻辑的函数签名步骤如下:明确函数的目的:描述其完成的任务。确定输入参数:指定其所需输入及其类型。指定返回类型:指定其返回的值的类型。 为 Golang 函数文档撰写合乎逻辑的函...
    99+
    2024-05-06
    golang 函数签名 排列
  • SpringBoot整合Elasticsearch实现索引和文档的操作方法
    目录1、SpringBoot整合Elasticsearch的步骤2、索引的操作2.1 索引存在验证2.2  创建索引2.3 删除索引3、文档的...
    99+
    2024-04-02
  • Golang函数的注释和文档生成的方法和工具
    作为一种高效、可靠、易于学习和使用的编程语言,Golang(以下简称Go)越来越受到开发者们的青睐。在使用Go编写代码时,经常需要编写注释、生成文档,而这些都是非常重要的程序开发流程中的一部分。因此,我们需要了解Golang函数的注释和文档...
    99+
    2023-05-17
    Golang 函数注释 文档生成工具
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作