sql >> Databáze >  >> NoSQL >> MongoDB

Upserting v Mongo DB a problém s Id

Narazil jsem na podobný problém. Chtěl jsem upsert dokumentů pomocí oficiálního ovladače C#. Měl jsem takovou třídu:

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

V konzoli bych napsal:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"}) a fungovalo by to. V C# jsem napsal:

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

a nefungovalo to! Protože ovladač obsahuje prázdné id v příkazu aktualizace a když vložím druhý dokument s jinou hodnotou výjimky Field1 E11000 duplicate key error index je vyvoláno (v tomto případě se Mongo pokusí vložit dokument s _id, který již v db existuje).

Když jsem vygeneroval _id sám (jako začátek tématu), narazil jsem na stejnou výjimku (mongo cannot change _id of a document ) při vkládání objektů s existující hodnotou Pole1.

Řešení je označit vlastnost Id atributem [BsonIgnoreIfDefault] (a neinicializovat jej). V tomto případě ovladač vynechá pole _id v příkazu aktualizace a MongoDb v případě potřeby vygeneruje Id.



  1. Jak naplnit vnořené entity v mongoose?

  2. Potřebujete zřetelný počet více polí, která byla připojena z jiné kolekce pomocí agregačního dotazu mongodb

  3. Načtěte pouze dotazovaný prvek v poli objektů v kolekci MongoDB

  4. MongoDB - Aktualizace objektu ve vnořeném poli