select函数不起作用,只能得到我想要的数组

时间:2016-04-26 20:25:28

标签: mongodb go mgo

我有这样的文件

{
"_id": {
    "$oid": "570bc73da8ebd9005dd54de3"
},
"title": "dota",
"imgurl": "asd.com",
"description": "",
"hints": [
    {
        "date": "2016-04-26 22:50:12.6069011 +0430 IRDT",
        "description": "narinin"
    },
    {
        "date": "2016-04-26 22:50:12.6069011 +0430 IRDT",
        "description": "doros shod"
    }
]
}

我执行的脚本是

hints := hints{}
err := db.C("games").Find(bson.M{"title": game}).Select(bson.M{"hints": 0}).One(&hints)

我的2个结构

type Game struct {
Id          bson.ObjectId `bson:"_id,omitempty"`
Title       string        `json:"title"`
Imgurl      string        `json:"imgurl"`
Description string        `json:"desc"`
Hints       []*hint       `bson:"hints", json:"hints"`
}

type hint struct {
    Description string    `json:"desc"`
    Date        time.Time `json:"date"`
}

当我使用脚本时,我得到的是一个无意义的日期字符串,甚至不在文档中 我怎样才能从游戏中得到一些提示

1 个答案:

答案 0 :(得分:0)

您也一直使用Game结构来接收结果,即使只有hints列也是如此。您的选择查询也应为.Select(bson.M{"hints": 1})

我修复了你的代码,并在当地尝试过,这个代码正在运行。

game := Game{}
err = db.C("games").Find(bson.M{"title": "dota"})
        .Select(bson.M{"hints": 1}).One(&game)
if err != nil {
    panic(err)
}

for _, hint := range game.Hints {
    fmt.Printf("%#v\n", *hint)
}

game的所有属性均为空,Hints除外。

已编辑1

要获取hints上的前10行,最简单的方法是播放切片,但这很糟糕,因为它需要先获取所有行。

for _, hint := range game.Hints[:10] { // 10 rows
    fmt.Printf("%#v\n", *hint)
}

另一个解决方案(更好)是在$slice查询上使用.Select()

selector := bson.M{"hints": bson.M{"$slice": 10}} // 10 rows

err = db.C("so").Find(bson.M{"title": "dota"})
        .Select(selector).One(&game)

已编辑2

[]int{skip, limit}上使用$slice,以支持跳过和限制。

selector := bson.M{"hints": bson.M{"$slice": []int{0, 10}}}