mongodb - 如何设置 slice 中的所有数据,使用 mgo 从 mongodb 获取?

标签 mongodb go mgo

我正在尝试从具有动态键的 MongoDB 中获取数据并将其设置在一个 slice 中。

这是我的数据样本:

_id ObjectIdHex("5911786dc28f25578150501d")
2017-05-01 [800 1000 1200 1400 1600]
_id ObjectIdHex("59117897c28f25578150501e")
2017-05-02 [800 1000 1200 1400 1600]
_id ObjectIdHex("5911789ec28f25578150501f")
2017-05-03 [800 1000 1200 1400 1600]
2017-05-04 [800 1000 1200 1400 1600]
_id ObjectIdHex("591178a6c28f255781505020")
_id ObjectIdHex("591178abc28f255781505021")
2017-05-05 [800 1000 1200 1400 1600]
_id ObjectIdHex("591178b0c28f255781505022")
2017-05-06 [800 1000 1200 1400 1600]
_id ObjectIdHex("591178b5c28f255781505023")
2017-05-07 [800 1000 1200 1400 1600]
_id ObjectIdHex("591178bac28f255781505024")
2017-05-08 [800 1000 1200 1400 1600]
_id ObjectIdHex("591178c8c28f255781505025")
2017-05-09 [800 1000 1200 1400 1600]
2017-05-10 [800 1000 1200 1400 1600]

我需要将其设置为类似 {2017-05-09 : [800 1000 1200 1400 1600]} 的数组,其他条目也一样。

我试过了

package main

import(
    "fmt"
    "gopkg.in/mgo.v2/bson"
    //"encoding/json"
)

type Spot struct{
    Id      bson.ObjectId   `json:"_id,omitempty" bson:"_id,omitempty"`
    Spots   map[string]interface{} `json:"spots"`
}

//type Values []Value

//var result []struct{ Value int }
type Spots []Spot

func getAllSpots() (Spots) {
    mongoSession := getDbSession()

    sessionCopy := mongoSession.Copy()
    defer sessionCopy.Close()
    var spots []Spot
    c := mongoSession.DB("test").C("spots")
    var data []bson.M
    err := c.Find(bson.M{}).All(&data)
    if err != nil {
        panic(err)
        // TODO: Do something about the error
    }

    test := make(map[string]int)
    for _, doc := range data {
      for key, value := range doc {
        if(key == "_id"){
            test[key] = value
            fmt.Println(key, value)
        }
      }
    }    

    return spots
}

我能够获取数据中的点,并能够使用 fmt.Println() 将输出写入控制台,但是当我将它分配给一个 slice 时,它会出现以下错误:

cannot use value (type interface {}) as type int in assignment: need type assertion

我在整个网络上进行了搜索,但找不到有效的解决方案。谁能指导我做错了什么?

最佳答案

如果您查看 bson.M 的文档,您会看到它只是 map[string]interface{} 的别名。这意味着当您对其进行范围时,您的键是一个字符串,您的值是一个接口(interface){}。您的目标是 map[string]int。因此,当您 test[key] = value 时,您试图将 value(interface{})分配给需要 的东西>int,如果没有显式转换(又名 type assertion ),您将无法做到这一点。这正是错误消息所说的:不能将值(类型接口(interface) {})用作赋值中的类型 int:需要类型断言。你可以改为:

test[key] = value.(int)

但正如 putu 指出的那样,看起来这些值实际上是 int 的数组,根本不适合 test 类型,因为它是字符串映射到单个 int 值。因此,您需要将 test 的类型更改为 map[string][]int 或从源数组中选择一个值以存储在 map 中,例如

test[key] = (value.([]int))[0]

关于mongodb - 如何设置 slice 中的所有数据,使用 mgo 从 mongodb 获取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43915387/

相关文章:

mongodb - 如何在Scala中的MongoDB聚合查询中使用 '$let'?

mongodb - 更新大量数据的最快方法

node.js - 使用node、mongodb和watchify时未找到Kerberos

arrays - 无法将字节 slice 解码回结构

go - 在 gorm 中使用 'FROM' 中的子查询

mongodb - golang中如何根据url从collection中查找数据?

mongodb - 将 Mongo 查询转换为 Mgo 查询

java - 连接spark master java的安全异常

go - 如何访问未导出的结构字段

mongodb - bson 方案的 Virtuals 属性