6

I am new in mongoDb and try to do an CRUD operation using mongoDb and Asp.net Core web api. My problem is altime whole object becomes update. I want to update specific fields that I send in web api.

Example :

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

Now I want to update only address to "my_New_add" and want to make below object :

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

API Call : http://localhost:88786/api/BusinessUnit/586e262268d90b290001b46e

body : {"Id" : "586e262268d90b290001b46e", "Address" : "my_New_add"}

But all time it updates full object. How can I solve it?

Below is my code :

Controller Code :

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

Repository Code :

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

Actually I want to do below query (I know mongodb is noSql, but for making my question clear I write below sql query)

UPDATE BusinessUnit Set Address = "my_New_add" WHERE Id = "586e262268d90b290001b46e"

Thanks in advance.

3
  • 1
    One of the main advantages of MongoDB is that you work with whole documents. Also don't confuse it with an ORM. You can do updates, but its more complicated Commented Jan 5, 2017 at 11:23
  • 2
    Also you have a very dangerous code there, your repository is async but your put method is sync and not awaiting for the update to happen. Your request will finish before the update is through and if you are in bad luck it may be disposed (depending on lifecycle) before its through Commented Jan 5, 2017 at 11:32
  • 1
    @Tseng thanks bro for these tips :) Commented Jan 5, 2017 at 11:36

2 Answers 2

6

FindOneAndReplace

A single document can be replaced atomically using the FindOneAndReplace or FindOneAndReplaceAsync methods.

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");
}

The above will find a document where the FirstName is Jack and set its FirstName field to John. It will then return the document that was replaced.

Please see the documentation here

Sign up to request clarification or add additional context in comments.

3 Comments

What is the procedure if someone needs to update the entire object to the database instead of few properties.
Try this var result = collection.FindOneAndReplace(filter, replacedocument); api.mongodb.com/csharp/2.2/html/…
1

Use this method :

 public ToDoItem Update(ToDoItem toDoItem)
 {
        yourCollection.ReplaceOne(item => item.Id == toDoItem.Id, toDoItem);
        return toDoItem;
 }

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.