MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Upserting in Mongo DB e il problema Id

Ho riscontrato un problema simile. Volevo aggiornare i documenti utilizzando il driver C# ufficiale. Ho avuto una classe come questa:

public class MyClass
{
    public ObjectId Id { get; set; }
    public int Field1 { get; set; }
    public string Field2 { get; set; }
}

In console scriverei:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"}) e funzionerebbe. In C# ho scritto:

collection.Update(Query.EQ("Field1", 3),
                Update.Replace(new MyClass { Field1 = 3, Field2 = "value" }),
                UpdateFlags.Upsert);

e non ha funzionato! Perché il driver include un ID vuoto nella dichiarazione di aggiornamento e quando inserisco il secondo documento con un valore diverso dell'eccezione Field1 E11000 duplicate key error index viene lanciato (in questo caso Mongo tenta di inserire un documento con _id che esiste già in db).

Quando ho generato _id da solo (come topic starter) ho riscontrato la stessa eccezione (mongo cannot change _id of a document ) sull'upserting di oggetti con il valore esistente di Field1.

Soluzione è contrassegnare la proprietà Id in base all'attributo [BsonIgnoreIfDefault] (e non inizializzarlo). In questo caso il driver omette il campo _id nella dichiarazione di aggiornamento e MongoDb genera l'ID se necessario.