mongodb - 从Golang中的bson.M中过滤出值

标签 mongodb dictionary go bson mgo

我对golang很陌生,想从mongodb的响应中过滤出软件包的名称和版本。我正在使用mgo从mongodb获取响应。
这是我的代码,可从mongodb获得响应:

    pipe := c.Pipe([]bson.M{{"$match": bson.M{"host": "test.server.lan"}}})
    resp := []bson.M{}

    err := pipe.All(&resp)
    if err != nil {
        fmt.Println("oh")
    }
    fmt.Println(resp)

响应的输出:
[map[_id:ObjectIdHex("4de39d42ke9fc601db635618") host:test.server.lan installed:[map[arch:all homepage: name:adduser status:ii vendor: version:3.118] map[arch:all homepage: name:adwaita-icon-theme status:ii vendor: version:3.30.1-1] map[arch:all homepage: name:ampua-watchdog status:ii vendor: version:2.2.2~ui10] map[arch:amd64 homepage:http://apparmor.net/ name:apparmor status:ii vendor: version:2.13.2-10] map[arch:amd64 homepage: name:apt status:ii vendor: version:1.8.2] map[arch:all homepage: name:apt-listchanges status:ii vendor: version:3.19] map[arch:amd64 homepage: name:apt-utils status:ii vendor: version:1.8.2] map[arch:amd64 homepage: name:base-files status:ii vendor: version:10.3+deb10u2]

我只想要每个软件包的名称和版本。

最佳答案

您收到的响应是一个具有内部String() string方法的对象,因此以这种方式输出。

它由 slice 和 map 组成,外观格式如下:

[
    map[
        _id:ObjectIdHex("4de39d42ke9fc601db635618")
        host:test.server.lan
        installed:
        [
            map[
                arch:all
                homepage:
                name:adduser
                status:ii
                vendor:
                version:3.118
            ]
            map[
                arch:all
                homepage:
                name:adwaita-icon-theme
                status:ii
                vendor:
                version:3.30.1-1
            ]
            map[
                arch:all
                homepage:
                name:ampua-watchdog
                status:ii
                vendor:
                version:2.2.2~ui10
            ]
            ...

可能更熟悉的外观是:
[
    {
        "_id":ObjectIdHex("4de39d42ke9fc601db635618"),
        "host":"test.server.lan",
        "installed":
        [
            {
                "arch":"all",
                "homepage":"",
                "name":"adduser",
                "status":"ii",
                "vendor":"",
                "version":"3.118"
            },
            {
                "arch":"all",
                "homepage":"",
                "name":"adwaita-icon-theme",
                "status":"ii",
                "vendor":"",
                "version":"3.30.1-1"
            },
            {
                "arch":"all",
                "homepage":"",
                "name":"ampua-watchdog",
                "status":"ii",
                "vendor":"",
                "version":"2.2.2~ui10"
            },
            ...

但是基本上是一样的。
要遍历resp,您可以执行以下操作:

for server := range resp {
    fmt.Printf("Host: %s\n", server.host)
    for installedPackage := range server.installed {
        fmt.Printf("\tPackage: %s\tVersion: %s\n", installedPackage.name, installedPackage.version)
    }
}

关于mongodb - 从Golang中的bson.M中过滤出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60072372/

相关文章:

go - 如何从源代码手动安装 Go 包

mongodb - key 不得包含 . pymongo 中的错误

python - 无法导入 UnicodeWriter python 2.7

rest - 在 Go over Google App Cloud 中通过 HTTP 端点提供大型静态二进制文件的最佳方法是什么?

function - 函数类型中的空接口(interface){}

javascript - Angular - 创建对象映射

mongodb - Spring boot/mongo 不会使用索引注释创建索引

mongodb - Django Rest框架序列化失败: 'MetaDict' object has no attribute 'pk'

javascript - 传入表单数据没有给出响应

dictionary - go1.10.3中add key/value与mapassign方法的关系