1

問題の簡単な例

やあ、

mgo を使用してドキュメントを mongodb に挿入し、ドキュメントを別のドキュメントに埋め込もうとしています。

mgo では、次のように 2 つの構造体を使用しています。

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("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)

これは以下を出力します:Found 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)

これは以下を出力します:Found document: [{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("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)

再印刷:Found document: [] またはFound document: [{InTest:map[test1:test test2:hello]}]両方のフィールドを検索する場合

埋め込まれた構造体/ドキュメント内の 1 つのフィールドに一致するドキュメントを見つけるにはどうすればよいですか?

前もって感謝します!

4

1 に答える 1

2

あなたの最初の質問は誤解を招くものでした。サブドキュメントを一致させる必要があります:

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)
}
于 2014-10-17T22:00:51.580 に答える