sql >> Databasteknik >  >> NoSQL >> MongoDB

Upserting i Mongo DB och Id-problemet

Jag har stött på liknande problem.Jag ville rubba dokument med den officiella C#-drivrutinen. Jag hade en klass så här:

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

I konsolen skulle jag skriva:db.collection.update({Field1: 3},{Field1: 3, Field2: "value"}) och det skulle fungera. I C# skrev jag:

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

och det gick inte! Eftersom drivrutinen inkluderar ett tomt ID i uppdateringssatsen och när jag upphäver det andra dokumentet med ett annat värde på Field1 undantag E11000 duplicate key error index kastas (i detta fall försöker Mongo infoga ett dokument med _id som redan finns i db).

När jag skapade _id av mig själv (som topic starter) har jag stött på samma undantag (mongo cannot change _id of a document ) om att flytta objekt med befintligt värde för Fält1.

Lösning är att markera Id-egenskap med attributet [BsonIgnoreIfDefault] (och inte initiera det). I det här fallet utelämnar drivrutinen _id-fältet i uppdateringssatsen och MongoDb genererar ID om det behövs.



  1. Inom en mongodb $match, hur man testar för field MATCHING, snarare än field EQUALING

  2. Observera:Odefinierad egenskap:MongoDB\Driver\Manager::$mydb i [Path] i wamp-servern

  3. Topp MongoDB-resurser

  4. Hur anger man Meteor MongoDB-version på lokal?