2017-01-05 26 views
2

mongoDbの新機能で、mongoDbとAsp.net Core web APIを使用してCRUD操作を実行しようとしています。 私の問題は、オブジェクト全体が更新されることです。私はWeb APIで送信する特定のフィールドを更新したい。mongoDbとasp.netコアの更新操作

例:

BusinessUnit oBU = new BusinessUnit(){ 
     Id = "586e262268d90b290001b46e", 
     Name = "BU_Name", 
     Address = "my_New_Add" 
    }; 

APIコール::http://localhost:88786/api/BusinessUnit/586e262268d90b290001b46e

体:{」

BusinessUnit oBU = new BusinessUnit(){ 
     Id = "586e262268d90b290001b46e", 
     Name = "BU_Name", 
     Address = "my_Add" 
    }; 

今、私は "my_New_add" とオブジェクトの下にしたいのアドレスのみを更新したいです「Id」:「586e262268d90b290001b46e」、「住所」:「my_New_add」}

しかし、それはいつも完全なオブジェクトを更新します。どうすれば解決できますか?以下は

私のコードです:

コントローラコード:

[HttpPut("{id}")] 
    public void Put(string id, [FromBody]BusinessUnit businessUnit) 
    { 
     _businessUnitRepository.UpdateBusinessUnit(id, businessUnit); 
    } 

リポジトリコード:

public async Task<ReplaceOneResult> UpdateBusinessUnit(string id, BusinessUnit businessUnit) 
    { 
     return await _context.BusinessUnits.ReplaceOneAsync(doc => doc.Id == id, businessUnit); 
    } 

実は私は(私はMongoDBのはNoSQLのですけど、作るために、クエリの下にやりたいです私の質問は、私はSQLクエリの下に書いてください)

UPDATE BusinessUnit Set Addr ess = "my_New_add" WHERE Id = "586e262268d90b290001b46e"

ありがとうございます。

+0

一つを見てくださいあなたは、全体の文書で作業ということです。また、ORMと混同しないでください。あなたは更新を行うことができますが、より複雑になります – Tseng

+0

また、そこには非常に危険なコードがあります。リポジトリは非同期ですが、あなたのputメソッドは同期しており、更新が起こるのを待っていません。更新が完了する前にリクエストが完了し、不運な場合はライフサイクルに応じて廃棄される可能性があります。 – Tseng

+0

@Tsengありがとうございました。 –

答えて

1

FindOneAndReplace

単一文書が FindOneAndReplace又はFindOneAndReplaceAsync方法を使用して原子的に置き換えることができます。

var filter = new BsonDocument("FirstName", "Jack"); 
var update = Builders<BsonDocument>.Update.Set("FirstName", "John"); 

var result = collection.FindOneAndUpdate(filter, update); 

if (result != null) 
{ 
    Assert(result["FirstName"] == "Jack"); 
} 

上記の姓がジャックされた文書を見つけて、ジョンにその姓フィールドを設定します。置換された文書が返されます。

ドキュメントのMongoDBの主な利点のhere

関連する問題