MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Upserting dans Mongo DB et le problème d'identification

J'ai rencontré un problème similaire. Je voulais mettre à jour des documents à l'aide du pilote C# officiel. J'ai eu un cours comme celui-ci :

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

Dans la console, j'écrirais :db.collection.update({Field1: 3},{Field1: 3, Field2: "value"}) et ça marcherait. En C# j'ai écrit :

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

et ça n'a pas marché ! Parce que le pilote inclut un identifiant vide dans l'instruction de mise à jour et lorsque je mets à jour le deuxième document avec une valeur différente de l'exception Field1 E11000 duplicate key error index est lancé (dans ce cas, Mongo essaie d'insérer un document avec _id qui existe déjà dans la base de données).

Lorsque j'ai généré _id par moi-même (comme le démarreur de sujet), j'ai rencontré la même exception (mongo cannot change _id of a document ) lors de la mise en place d'objets avec la valeur existante de Field1.

Solution est de marquer la propriété Id par l'attribut [BsonIgnoreIfDefault] (et ne pas l'initialiser). Dans ce cas, le pilote omet le champ _id dans l'instruction de mise à jour et MongoDb génère un identifiant si nécessaire.