Получение документа из коллекции по id

Мой объект у меня есть в коллекции:

type Room struct {
    Id bson.ObjectId            `json:"Id"                  bson:"_id"`
    Name string                 `json:"Name"                bson:"name"`
}

Вставка в коллекцию:

room = &Room{Id: bson.NewObjectId(), Name: "test"}
RoomCollection.Insert(room)

Получение из коллекции (любой):

roomX := &Room{}
if err := RoomCollection.Find(bson.M{}).One(roomX); err != nil {
    panic(err)
}
fmt.Printf("RoomX %s:\n%+v\n\n", roomX.Id, roomX)

Это выводит:

RoomX ObjectIdHex("52024f457a7ea6334d000001"):
&{Id:ObjectIdHex("52024f457a7ea6334d000001") Name:test}

Получение из коллекции (по id):

roomZ := &Room{}
if err := RoomCollection.Find(bson.M{"_id": room.Id}).One(roomZ); err != nil {
    panic(err) // throws "not found"
}

Это бросает «не найдено», и я не могу понять, почему.


person TrueFurby    schedule 07.08.2013    source источник
comment
Ваш код выглядит правильно. Мне просто интересно, является ли пробел правильным способом разделения тегов полей json и bson? Проверьте консоль MongoDB и убедитесь, что Room.Id хранится с _id, а не id в качестве имени поля.   -  person ANisus    schedule 07.08.2013
comment
обычно это запятая   -  person thwd    schedule 07.08.2013
comment
@tomwilde: Да, но в пакете Reflect указано, что это optionally space-separated . Ондрей мог бы попробовать использовать один пробел вместо нескольких.   -  person ANisus    schedule 07.08.2013
comment
Вы были правы, это была вкладка, вызывающая проблему. Спасибо.   -  person TrueFurby    schedule 07.08.2013
comment
Ах, приятно знать. Я добавил это как ответ тогда :)   -  person ANisus    schedule 07.08.2013


Ответы (1)


Различные теги ключ-значение для поля должны, согласно пакету reflect, разделяться пробелом.

По соглашению, строки тегов представляют собой конкатенацию пар «ключ:значение», которые могут быть разделены пробелами. Каждый ключ представляет собой непустую строку, состоящую из неуправляющих символов, отличных от пробела (U+0020 ' '), кавычек (U+0022 '"') и двоеточия (U+003A ':'). Каждое значение заключено в кавычки. используя символы U+0022 '"' и синтаксис строкового литерала Go.

Пакет mgoне может прочитать тег и сохраняет значение идентификатора как id вместо _id.

person ANisus    schedule 07.08.2013