2017-10-30 8 views
0

特定のプロパティを持つmongo dbに既存のドキュメントがあります。このドキュメントを同じIDのドキュメントで更新しようとしていますが、それ以上のプロパティを持つドキュメントは更新されません。私は私が更新しようとしていたときに/次のドキュメントでこの文書を置き換える今既存のドキュメントを更新するC#Mongo dbドライバ

{ 
    "_id" : "1234", 
    "AccountNumber" : "3453535345354", 
    "Name" : "new1", 
    "PhoneNumber" : "34534535353534543", 
    "ETag" : "6ba32e6e-3808-41f5-9b28-0ea882d9c629", 
    "Id" : "1234" 
} 

私のDB内の既存の文書が、それは動作しませんされた後のmongo DBドライバのバージョン2.4.4

を使用しています:

public async Task UpsertDocument(string collectionId, string documentId, BsonDocument item) 
     { 
      var collection = database.GetCollection<BsonDocument>(collectionId); 

      var initialCorrelationId = item["ETag"].AsString; 
      item["ETag"] = Guid.NewGuid().ToString(); 
      var builders = Builders<BsonDocument>.Filter; 

      var filter = builders.Eq(x => x["Id"], documentId) & builders.Eq(x => x["ETag"], initialCorrelationId); 

      var options = new FindOneAndReplaceOptions<BsonDocument, BsonDocument> 
      { 
       ReturnDocument = ReturnDocument.Before, 
       IsUpsert = true 
      }; 

      try 
      { 
       item["Id"] = documentId; 
       item["_id"] = documentId; 

       await collection.FindOneAndReplaceAsync(filter, item, options); 
      } 
      catch (MongoCommandException ex) when (ex.Code == 11000) 
      { 
       throw new ConcurrencyException(
        $"Error upserting item with id {documentId} and etag {item["Etag"]}{Environment.NewLine}{item.ToJson()}"); 
      } 
     } 

:私のアップサート方​​式のためのC#コードで続き

{ 
    "AccountNumber": "3453535345354", 
    "Name":"new1", 
    "PhoneNumber":"34534535353534543", 
    "TempProperty":"something new", 
    "ETag" : "6ba32e6e-3808-41f5-9b28-0ea882d9c629", 
    "Id" : "1234", 
    "_id" : "1234" 
} 

どんな助けでも大歓迎です。

+0

「Id」と「_id」の両方を持つ理由はありますか? – Mahdi

答えて

0

は、次のようにクラスを持っていると仮定すると:

public class Thing 
{ 
    public ObjectId Id { get; set; } 
    public string AccountNumber { get; set; } 
    public string Name { get; set; } 
    public string PhoneNumber { get; set; } 
    public string ETag { get; set; } 
    public string SecondId { get; set; } 
} 

次のコードは、あなたが欲しいものを行います。

var context = new Context(); 
var tempProperty = "newValue"; 
var id = "1234"; // This should be unique 
var builder = Builders<Thing>.Filter; 
var filter = builder.Eq(x => x.SecondId, id); 
var update = Builders<Thing>.Update 
    .Set("TempProperty", tempProperty); 
context.ThingCollection.UpdateOne(filter, update, new UpdateOptions() {IsUpsert = true}); 

私はちょうどSecondIdにIDを改名しました。

関連する問題