使用struct作为查找参数

时间:2016-09-23 12:55:53

标签: mongodb go mgo

问题描述

我尝试使用GO

查找存储在MongoDB中的文档

当前状态

出于测试目的,我创建了一个小型测试程序,将数据插入MongoDB并立即尝试查询:

package main

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

type IndexedData struct {
    ID      bson.ObjectId `json:"id" bson:"_id,omitempty"`
    MyID    int           `json:"myid" bson:"myid"`
    Content string        `json:"content" bson:"content"`
}

func main() {
    // Create a client
    session, err := mgo.Dial("localhost")
    if err != nil {
        panic(err)
    }
    defer session.Close()

    collection := session.DB("test").C("demo")

    for index := 0; index < 10; index++ {
        data := IndexedData{ID: bson.NewObjectId(), MyID: index, Content: "Some string"}
        err = collection.Insert(data)
        if nil != err {
            panic(err)
        } else {
            fmt.Println("Successfully inserted")
        }
    }

    for index := 9; index >= 0; index-- {
        qry := collection.Find(IndexedData{MyID: index})
        cnt, err := qry.Count()
        if err != nil {
            fmt.Println(fmt.Sprintf("%v - %s", index, err.Error()))
        } else {
            if cnt == 1 {
                fmt.Println("Found")
            } else {
                if cnt > 1 {
                    fmt.Println(fmt.Sprintf("%v - Multiple: %v", index, cnt))
                } else {
                    fmt.Println(fmt.Sprintf("%v - Not found", index))
                }
            }
        }
    }

    qry := collection.Find(nil)
    cnt, err := qry.Count()
    if err != nil {
        panic(err)
    }
    fmt.Println(fmt.Sprintf("%v items", cnt))

    err = collection.DropCollection()
    if err != nil {
        panic(err)
    }
}

结果

实际

Successfully inserted Successfully inserted Successfully inserted Successfully inserted Successfully inserted Successfully inserted Successfully inserted Successfully inserted Successfully inserted Successfully inserted 9 - Not found 8 - Not found 7 - Not found 6 - Not found 5 - Not found 4 - Not found 3 - Not found 2 - Not found 1 - Not found 0 - Not found 10 items

期待

我原本期望获得10次Found

更新1

我改变了

qry := collection.Find(IndexedData{MyID: index})

qry := collection.Find(bson.M{"myid": index})

我得到了一份工作样本。

文档说明:

The document may be a map or a struct value capable of being marshalled with bson. The map may be a generic one using interface{} for its key and/or values, such as bson.M, or it may be a properly typed map.

我解释了一个正确注释的结构将起作用。

问题

如何成功查询文档的属性?

2 个答案:

答案 0 :(得分:1)

我认为你可以解决一个问题。 我比较了 bson.M 和你的结构的 bson.Marshal 的输出。

output

1为<36>行 fmt.Printf(&#34;%v \ n&#34;,in)

2 fmt.Printf(&#34;%v \ n&#34;,in) that row

3是that row

的输出 println(字符串(e.out))

e.out 的输出对于struct和map是不同的。我怀疑这是一个错误。 另外我注意到没有一些测试结构的测试。所有测试都使用 bson.M

感谢您提出了一个精彩的问题格式!

答案 1 :(得分:0)

我不知道关于go的任何事情,但我猜你不需要行qry := collection.Find(nil)中的nil