2012-04-03 22 views
11

Tengo un documento de producto que contiene una matriz de documentos. Por ejemploUsando el controlador mongo C#, ¿cómo serializar una matriz de objetos personalizados para almacenarlos?

{ 
id: 1, 
name: "J-E-L-L-O", 
store:[{id: 1, 
    name: "Store X"}, 
    {id: 2, 
    name: "Store Y"}] 
} 

me gustaría cambiar el nombre de "tienda Y" para tienda Z", por ejemplo. En ese momento, no sé el índice del objeto. Por lo tanto, me tire de la totalidad . matriz, encontrar el objeto de actualizar, cambiar el nombre, y luego tratar de establecer el valor de "tienda" con la matriz actualizada

productCollection.Update(query, Update.Set("store", storeList.ToBsonDocument())); 

Sin embargo, estoy consiguiendo un error: "An Array value cannot be written to the root level of a BSON document."

pienso Solo necesito saber cómo serializar la matriz de objetos personalizados a una matriz de BsonDocument s.

Gracias de antemano por su ayuda.

Respuesta

2

La excepción dice que no puede convertir una matriz/lista en un BsonDocument. Creo que está buscando convertir storeList a [BsonArray][1].

Si storeList es ya una gran variedad de BsonDocument o algún IEnumerable<T> dónde se puede convertir en un BsonDocument, la que debería no necesita convertir la variable storeList en absoluto.

+0

Es una lista genérica de objetos personalizados, tan lista . ¿Debo convertir cada elemento en BsonDocument y luego ponerlo en una matriz? – JalapenoHottie

7

Lamentablemente tuve el mismo problema y terminé haciendo un método de extensión para ayudarme a solucionarlo.

public static BsonArray ToBsonDocumentArray(this IEnumerable list) 
    { 
     var array = new BsonArray(); 
     foreach (var item in list) 
     { 
      array.Add(item.ToBson()); 
     } 
     return array; 
    } 

por lo que debe ser capaz de hacer:

productCollection.Update(query, Update.Set("store", storeList.ToBsonDocumentArray())); 
+0

Cuando uso el método de extensión que mencionó, aparece el siguiente error como: Un valor de cadena no se puede escribir en el nivel raíz de un documento BSON. ¿Algunas ideas? –

0

se debe utilizar

BsonDocument.Parse(storeList); 

en lugar de

storeList.ToBsonDocument() 
+0

No, no puedes usar Parse ya que se usa en cadenas, no en listas u otros objetos. – bonitzenator

1

poco de edición para la función de respuesta aceptada:

public static BsonArray ToBsonDocumentArray(this IEnumerable list) 
    { 
     var array = new BsonArray(); 
     foreach (var item in list) 
     { 
      array.Add(item); 
     } 
     return array; 
    } 

No es necesario convertir item.ToBson(). Ya existe una conversión implícita de string a bson. Es la razón por la que recibí un mensaje de error "Un valor de cadena no se puede escribir en el nivel raíz de un documento BSON."

Cuestiones relacionadas