2012-04-03 6 views
11

Ho un documento prodotto che contiene una serie di documenti. Per esempioUtilizzando il driver mongo C#, come serializzare una matrice di oggetto personalizzato per poterla archiviare?

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

Vorrei cambiare il nome di "Store Y" al deposito Z", per esempio. A quel tempo, non so l'indice dell'oggetto. Quindi, tiro l'intero . array, trovare l'oggetto di aggiornare, modificare il nome, e quindi tentare di impostare il valore di "store" con la matrice aggiornata

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

Tuttavia, sto ottenendo un errore: "An Array value cannot be written to the root level of a BSON document."

penso Ho solo bisogno di sapere come serializzare la matrice di oggetti personalizzati su una matrice di BsonDocument S.

Grazie in anticipo per il vostro aiuto.

risposta

2

L'eccezione indica che non è possibile convertire un array/elenco in un BsonDocument. Penso che stai cercando di convertire storeList in un [BsonArray][1].

Se storeList è già una serie di BsonDocument o qualche IEnumerable<T> dove può essere convertito in un BsonDocument, la si dovrebbe non hanno bisogno di lanciare la variabile storeList a tutti.

+0

È un elenco generico di oggetti personalizzati, quindi Lista . Devo convertire ogni elemento in un BsonDocument e poi metterlo in un array? – JalapenoHottie

7

Sfortunatamente ho avuto lo stesso problema e ho finito per creare un metodo di estensione che mi aiutasse a risolverlo.

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

così si dovrebbe essere in grado di fare:

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

Quando uso il metodo di estensione che hai menzionato, ricevo il seguente errore come: Un valore di stringa non può essere scritto nel livello radice di un documento BSON. Qualche idea? –

0

dovreste usare

BsonDocument.Parse(storeList); 

invece di

storeList.ToBsonDocument() 
+0

No, non puoi usare Parse poiché viene usato su stringhe, non su liste o altri oggetti. – bonitzenator

1

Piccola modifica per la funzione di risposta accettata:

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

non è necessario convertire item.ToBson(). Esiste già una conversione implicita da stringa a bson.Questa è la ragione per cui ricevevo un messaggio di errore "Impossibile scrivere un valore di stringa nel livello radice di un documento BSON."

Problemi correlati