sql >> Database >  >> NoSQL >> MongoDB

Upserting in Mongo DB en het ID-probleem

Ik ben een soortgelijk probleem tegengekomen. Ik wilde documenten opwaarderen met het officiële C#-stuurprogramma. Ik had een les als deze:

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

In console zou ik schrijven:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"}) en het zou werken. In C# schreef ik:

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

en het werkte niet! Omdat het stuurprogramma een lege id in de update-instructie opneemt en wanneer ik het tweede document met een andere waarde van Field1-uitzondering invoeg E11000 duplicate key error index wordt gegooid (in dit geval probeert Mongo een document in te voegen met _id dat al bestaat in db).

Toen ik zelf _id genereerde (zoals topic starter) ben ik dezelfde uitzondering tegengekomen (mongo cannot change _id of a document ) bij het opwaarderen van objecten met de bestaande waarde van Veld1.

Oplossing is om Id-eigenschap te markeren met attribuut [BsonIgnoreIfDefault] (en niet initialiseren). In dit geval laat het stuurprogramma het veld _id weg in de update-instructie en genereert MongoDb indien nodig een Id.



  1. Robijn/rails:mongoïde met mongo(edelsteen); een bson-conflict? Hoe om te gaan met verschillende versies?

  2. SCAN vs KEYS-prestaties in Redis

  3. waarom Redis single-threaded is (gebeurtenisgestuurd)

  4. Hoe het laatste object van een array op te halen in een ingesloten document in Mongoose?