英文:
mgo, mongodb: Finding documents that match one field from embedded struct
问题
问题的简化示例
你好,
我正在使用mgo将文档插入到MongoDB中,我尝试在另一个文档中嵌入一个文档。
使用mgo,我使用了两个结构体:
type Test struct {
InTest SubTest `bson:"in_test"`
}
type SubTest struct {
Test1 string `bson:"test1"`
Test2 string `bson:"test2"`
}
然后我插入一个文档:
test := Test{InTest: SubTest{Test1: "test", Test2: "hello"}}
err = col.Insert(test)
if err != nil {
fmt.Printf("无法插入文档:%+v\n", err)
os.Exit(1)
}
现在我想根据嵌入文档中的字段来查找这个文档:
var tests []Test
err = sess.DB("test").C("test").Find(
bson.M{"in_test": bson.M{"test1": "test"}}).All(&tests)
if err != nil {
fmt.Printf("查找文档时出错:%+v\n")
os.Exit(1)
}
fmt.Printf("找到文档:%+v\n", tests)
这将打印:找到文档:[]
而使用两个字段进行搜索将返回文档:
var tests []Test
err = sess.DB("test").C("test").Find(
bson.M{"in_test": bson.M{"test1": "test", "test2": "hello"}}).All(&tests)
if err != nil {
fmt.Printf("查找文档时出错:%+v\n")
os.Exit(1)
}
fmt.Printf("找到文档:%+v\n", tests)
这将打印:找到文档:[{InTest:{Test1:test Test2:hello}}]
我尝试过以bson.M格式插入文档,但结果相同:
type Test struct {
InTest bson.M `bson:"in_test"`
}
test := Test{InTest: bson.M{"test1": "test", "test2": "hello"}}
err = col.Insert(test)
if err != nil {
fmt.Printf("无法插入文档:%+v\n", err)
os.Exit(1)
}
var tests []Test
err = sess.DB("test").C("test").Find(
bson.M{"in_test": bson.M{"test1": "test"}}).All(&tests)
if err != nil {
fmt.Printf("查找文档时出错:%+v\n")
os.Exit(1)
}
fmt.Printf("找到文档:%+v\n", tests)
再次打印:找到文档:[]
或者 找到文档:[{InTest:map[test1:test test2:hello]}]
(如果搜索两个字段)
如何查找与嵌入结构/文档中的一个字段匹配的文档?
提前感谢!
英文:
SIMPLIFIED EXAMPLE OF ISSUE
Hi,
Using mgo to insert documents into mongodb, I'm trying to embed a document within another.
With mgo I'm using two structs for this like this:
type Test struct {
InTest SubTest `bson:"in_test"`
}
type SubTest struct {
Test1 string `bson:"test1"`
Test2 string `bson:"test2"`
}
I then insert a document:
test := Test{InTest: SubTest{Test1: "test", Test2: "hello"}}
err = col.Insert(test)
if err != nil {
fmt.Printf("Can't insert document: %+v\n", err)
os.Exit(1)
}
Now I'd like to find this document based on a field in the embedded document:
var tests []Test
err = sess.DB("test ").C("test").Find(
bson.M{"in_test": bson.M{"test1": "test"}}).All(&tests)
if err != nil {
fmt.Printf("Got an error finding documents %+v\n")
os.Exit(1)
}
fmt.Printf("Found document: %+v\n", tests)
This prints: Found document: []
Whereas searching using both fields returns the document:
var tests []Test
err = sess.DB("test").C("test").Find(
bson.M{"in_test": bson.M{"test1": "test", "test2": "hello"}}).All(&tests)
if err != nil {
fmt.Printf("Got an error finding documents %+v\n")
os.Exit(1)
}
fmt.Printf("Found document: %+v\n", tests)
This prints: Found document: [{InTest:{Test1:test Test2:hello}}]
I've tried inserting the document in bson.M format as well but with the same results:
type Test struct {
InTest bson.M `bson:"in_test"`
}
test := Test{InTest: bson.M{"test1": "test", "test2": "hello"}}
err = col.Insert(test)
if err != nil {
fmt.Printf("Can't insert document: %+v\n", err)
os.Exit(1)
}
var tests []Test
err = sess.DB("test").C("test").Find(
bson.M{"in_test": bson.M{"test1": "test"}}).All(&tests)
if err != nil {
fmt.Printf("Got an error finding documents %+v\n")
os.Exit(1)
}
fmt.Printf("Found document: %+v\n", tests)
Again printing: Found document: []
or Found document: [{InTest:map[test1:test test2:hello]}]
if searching both fields
How do I find a document matching ONE field in an embedded struct/document?
Thanks in advance!
答案1
得分: 2
你的初始问题有误导性,你需要匹配子文档:
func main() {
sess, err := mgo.Dial("localhost")
if err != nil {
fmt.Printf("无法连接到MongoDB,错误:%v\n", err)
os.Exit(1)
}
col := sess.DB("test").C("test")
test := Test{InTest: SubTest{Test1: "test", Test2: "hello"}}
err = col.Insert(test)
if err != nil {
fmt.Printf("无法插入文档:%+v\n", err)
os.Exit(1)
}
var tests []Test
err = col.Find(bson.M{"in_test.test2": "hello"}).All(&tests)
fmt.Println(tests)
}
请注意,这只是代码的翻译部分,不包括其他内容。
英文:
Your initial question was misleading, you need to match the subdocument:
func main() {
sess, err := mgo.Dial("localhost")
if err != nil {
fmt.Printf("Can't connect to mongo, go error %v\n", err)
os.Exit(1)
}
col := sess.DB("test").C("test")
test := Test{InTest: SubTest{Test1: "test", Test2: "hello"}}
err = col.Insert(test)
if err != nil {
fmt.Printf("Can't insert document: %+v\n", err)
os.Exit(1)
}
var tests []Test
err = col.Find(bson.M{"in_test.test2": "hello"}).All(&tests)
fmt.Println(tests)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论