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

时间:2017-05-11 12:26:25

标签: mongodb go mgo

我正在尝试从具有动态密钥的MongoDB中获取数据并将其设置在切片中。

这是我的数据样本:

_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()将输出写入控制台但是当我将其分配给切片时,它会给我以下错误:

  

不能在赋值时使用值(类型interface {})作为int类型:need type assertion

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

1 个答案:

答案 0 :(得分:1)

如果查看bson.M的文档,您会发现它只是map[string]interface{}的别名。这意味着,当您range覆盖它时,您的密钥为string,您的值为interface{}。您的目标是map[string]int。因此,当您test[key] = value时,您正在尝试将valueinterface{})分配给期待int的内容,而您无法做到cannot use value (type interface {}) as type int in assignment: need type assertion。显式演员(又名type assertion)。这正是错误消息所说的内容:test[key] = value.(int) 。你可以这样做:

int

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

using (var db = new DataContext(dbConnectionString))
{
   ids = new list<long> {"1","2",...};
   var data = (from item in db.GetTable<dataTable>().AsEnumerable()
               where ids.Contains(item.ID)
               select new customDataStructure{}).ToList();
}