sort gopkg golang go mgo

gopkg - Colecciones no estructuradas de MongoDB con mgo



mgo mongodb driver (2)

Hay varias formas en que puede manejar esto.

Usando un mapa:

var m bson.M err := collection.Find(nil).One(&m) check(err) for key, value := range m { fmt.Println(key, value) }

Tenga en cuenta que no hay nada especial acerca de bson.M en lo que se refiere a mgo. Es solo un tipo de map[string]interface{} , y puede definir sus propios tipos de mapas y usarlos con mgo, incluso si tienen un tipo de valor diferente.

Usando un segmento de documento:

El bson.D es un segmento conocido internamente por mgo, y existe tanto para ofrecer un mecanismo más eficiente como para ofrecer una forma de preservar el orden de las claves, que es utilizado por MongoDB en algunas circunstancias (por ejemplo, al definir índices).

Por ejemplo:

var d bson.D err := collection.Find(nil).One(&d) check(err) for i, elem := range d { fmt.Println(elem.Name, elem.Value) }

Usando un campo de mapa en línea

La bandera bson en ,inline también se puede usar en un campo de mapa, para que pueda tener su pastel y comérselo también. En otras palabras, permite usar una estructura para que la manipulación de campos conocidos sea conveniente y, al mismo tiempo, permite tratar con campos desconocidos a través del mapa en línea.

Por ejemplo:

type Person struct { ID bson.ObjectId `bson:"_id,omitempty"` Name string Phone string Extra bson.M `bson:",inline"` }

Soy MUY nuevo para ir. Por lo que he visto en los ejemplos de mGo, para consultar una colección y luego leer de ella, debe predefinir los datos que volverán en una estructura.

type Person struct { ID bson.ObjectId `bson:"_id,omitempty"` Name string Phone string Timestamp time.Time }

En PHP, el documento fue asignado a una matriz. Esto fue perfecto, ya que un registro puede tener un conjunto de claves completamente diferente (puede que no contenga el nombre o el teléfono pero contenga el correo electrónico) y pude acceder directamente sin configurar una clase / estructura / variable predefinida.

¿Hay alguna manera de hacer lo mismo en Go / mGo?


Podrías almacenar todo en un mapa. El paquete mgo/bson proporciona un tipo de datos bson.M que se puede usar para almacenar datos arbitrarios y, dado que MongoDB no aplica un esquema sólido, mgo usa el tipo bson.M internamente para todo.

Si solo quieres mostrar los datos, usar bson.M debería estar bien, pero una vez que quieras comenzar a trabajar con él, deberías considerar usar una estructura en su lugar. De lo contrario, necesitaría muchas aserciones de tipo en su programa. Por ejemplo, considere que desea imprimir el título ( result["title"] ) de su documento en mayúscula. Al usar solo bson.M , su código se vería así:

// is there a title attribute? if title, ok := result["title"]; ok { // is it a string? (and not another map or integer or something else) if titleStr, ok := title.(string); ok { // ok, it is a string fmt.Println("Title: ", strings.ToUpper(titleStr)) } }

Su programa mgo mucho más legible y más fácil de mantener cuando deje que mgo convierta los datos en una estructura para usted. Entonces, el mismo código podría leer como:

fmt.Println(strings.ToUpper(result.Title))

Normalmente, usted define un tipo de estructura para cada tipo de documento que desea tratar (es decir, un tipo para "usuarios", otro para "publicaciones de blog", etc.) que contiene cada atributo al que puede querer acceder. Si su documento de usuario no tiene asignada una dirección de correo electrónico, obtendrá una cadena vacía (o más generalmente, el valor cero) cuando la decodifique.