2010-12-07 11 views
5

ile MongoDB içinde gömülü Doküman güncelleme:resmi C# sürücüsü

{ 
    "_id": 1 
    "_t": "Company", 
    "Name": "Test Company" 
    "Divisions": [ 
    { 
     "_id": 1 
     "_t": "Division", 
     "Name": "Test Division 1" 
    }, 
    { 
     "_id": 2 
     "_t": "Division", 
     "Name": "Test Division 2" 
    } 
    ] 
} 

official 10gen C# driver kullanırken bütün bir Bölümü/kaydetme güncelleştirmek için en iyi yolu nedir? (En son 0.9 sürümü.)

Bölümler eklemek için Update.AddToSetWrapped kullanıyorum ve bu iyi çalışıyor, ancak aynı zamanda _id'e bağlı olarak belgeleri güncelleştirmeyi de istiyorum. Örneğin

, aşağıdaki güncelleştirme yöntemi tanımlarsak:

public void UpdateDivision(IDivision division) 
{ 
    var mongo = MongoServer.Create(_connectionString); 
    var database = mongo.GetDatabase(_databaseName); 
    var query = Query.EQ("_id", division.CompanyId); 
    var update = Update.AddToSetWrapped("Divisions", division); 
    database.GetCollection<Company>("Company") 
      .Update(query, update, UpdateFlags.Upsert, SafeMode.True); 
} 

ve bu gibi çağırır:

var division = GetDivisionById(1); 
division.Name = "New Name"; 
UpdateDivision(division); 

sonra takım yeni bir örneğini olsa da, baz grubu eklenecek "_id" hala 1, İsim farklıdır ve bu nedenle benzersiz bir belgedir.

Tüm yerleşik bir belgeyi güncellemenin iyi bir yolu nedir?

Daha iyi bir çözüm bulmadan önce, ilk Bölüm $pull'a gidiyorum ve sonra değiştirilmiş Bölme ile $addToSet'a gidiyorum. Bu çalışır ancak iki ayrı güncellemeyi gerçekleştirdiği için ideal değildir.

cevap

11

Sen şöyle bir kerede dizideki tüm bir bölümü güncellemek için MongoDB konumsal dizi modifikasyon özelliğini kullanabilirsiniz: anahtar şeyler burada devam

var division = GetDivisionById(1); 
division.Name = "New Name"; 
// change any other properties of division you want 
collection.Update(
    Query.EQ("Divisions._id", 1), 
    Update.Set("Divisions.$", BsonDocumentWrapper.Create<IDivision>(division)) 
); 

şunlardır:

  1. kullanımı Update.Set
  2. 'da "$" ifadesinin yer alması Update.Set'in ikinci bağımsız değişken olarak bir BsonValue gerektirdiğinden, ayırma değerini tutmak için bir BsonDocumentWrapper kullanmamız gerekir (IDivision type parametresi, Serileştirme sırasında nominalType'ı ayarlar) "_t" ayırımcısının yazılmasıyla sonuçlanan IDivision'a.
İlgili konular