mgo, mongodb: поиск документов, соответствующих одному полю из встроенной структуры

УПРОЩЕННЫЙ ПРИМЕР ВЫДАЧИ

Hi,

Используя 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("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]}] при поиске по обоим полям

Как найти документ, соответствующий ОДНОМУ полю во встроенной структуре/документе?

Заранее спасибо!


person Kyohei Kaneko    schedule 17.10.2014    source источник


Ответы (1)


Ваш первоначальный вопрос вводил в заблуждение, вам нужно сопоставить поддокумент:

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)
}
person OneOfOne    schedule 17.10.2014
comment
Спасибо за ответ, я добавил его в свой код, но у меня все еще есть проблемы. См. мой отредактированный вопрос для получения более подробной информации и упрощенного макета. - person Kyohei Kaneko; 19.10.2014
comment
@KyoheiKaneko проверьте новый ответ. - person OneOfOne; 19.10.2014
comment
Это именно то, что я искал! Большое спасибо. - person Kyohei Kaneko; 20.10.2014