我尝试使用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
我改变了
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.
我解释了一个正确注释的结构将起作用。
如何成功查询文档的属性?
答案 0 :(得分:1)
我认为你可以解决一个问题。 我比较了 bson.M 和你的结构的 bson.Marshal 的输出。
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