2014-05-03 24 views
31

Quando si utilizza FindOne() utilizzando MongoDB e C#, esiste un modo per ignorare i campi non trovati nell'oggetto?MongoDB C# Driver - Ignora i campi sul binding

EG, esempio di modello.

public class UserModel 
{ 
    public ObjectId id { get; set; } 
    public string Email { get; set; } 
} 

Ora abbiamo anche memorizzare una password nella raccolta MongoDB, ma non vogliono legarsi ad uscire oggetto sopra. Quando facciamo un GET in questo modo,

var query = Query<UserModel>.EQ(e => e.Email, model.Email); 
    var entity = usersCollection.FindOne(query); 

Otteniamo il seguente errore

Element 'Password' does not match any field or property of class 

Esiste un modo per dire a Mongo di ignorare i campi cant match con i modelli?

risposta

58

Sì. Basta decorare la vostra classe UserModel con l'attributo BsonIgnoreExtraElements:

[BsonIgnoreExtraElements] 
public class UserModel 
{ 
    public ObjectId id { get; set; } 
    public string Email { get; set; } 
} 

Come suggerisce il nome, il conducente sarebbe ignorare qualsiasi campi aggiuntivi, invece di un'eccezione.

+1

@ l3arnon ci si può organizzare a livello globale? – LiamB

+4

Può essere impostato globalmente utilizzando una convenzione, come indicato qui: https://jira.mongodb.org/browse/CSHARP-965. Per impostazione predefinita non ignoriamo gli elementi extra perché significa che stai perdendo dati e che non è sicuro. –

6

Sì. Un altro modo (invece di modificare voi classe del modello) è quello di utilizzare "Registrati Class Mappa" con "SetIgnoreExtraElements"

Nel tuo caso basta aggiungere questo codice quando si inizializza il driver:

BsonClassMap.RegisterClassMap<UserModel>(cm => 
{ 
    cm.AutoMap(); 
    cm.SetIgnoreExtraElements(true); 
}); 

si può leggere di più su Mongo Class Mapping in:

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/bson/mapping/

2

ancora un altro possibile soluzione, è quello di registrare una truffa attenzione per questo.

In questo modo, non è necessario annotare tutte le classi con [BsonIgnoreExtraElements].

Da qualche parte durante la creazione del client mongo, impostare le seguenti:

 var pack = new ConventionPack(); 
     pack.Add(new IgnoreExtraElementsConvention(true)); 
     ConventionRegistry.Register("My Solution Conventions", pack, t => true); 
+0

Grazie .. mi ha aiutato molto a non decorare tutto il mio poco con l'ObjectId. In questo modo ho un contratto dati pulito senza dipendenze specifiche di mongo. – Pascalsz

Problemi correlati