Фильтрация значений из bson.M в golang - PullRequest
0 голосов
/ 05 февраля 2020

Я новичок в golang и хотел отфильтровать имя и версию для пакетов из ответа от моего mongodb. Я использую m go, чтобы получить ответ от 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]

Я просто хочу имя и версию для каждого пакета.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

Чтобы отобразить только выбранные поля, используйте $ project.

См .: https://docs.mongodb.com/manual/reference/operator/aggregation/project/

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

        {
            "$project": bson.M{
                "version": 1,
                "name":  1,
            },
        },
      })
0 голосов
/ 05 февраля 2020

Полученный вами ответ является объектом, который имеет внутренний метод String() string и, таким образом, выводится следующим образом.

Он состоит из фрагментов и карт и выглядит следующим образом:

[
    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"
            },
            ...

Но в основном то же самое. Чтобы перебрать респ, вы можете сделать:

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)
    }
}

...