Update / delete supporting document in mongodb using C # driver

I have 2 classes:

public class Vote { public string VoteId { get; set; } public string Question { get; set; } public List<VoteAnswer> AnswerList { get; set; } } 

AND:

 public class VoteOption { public string OptionId { get; set; } public string OptionName { get; set; } public double VoteCount { get; set; } } 

How can I update / delete a VoteOption in Vote , where VoteId = voteId and OptionId = optionId ? Using the C# driver.

First I get VoteOption:

  var v = col.FindOneAs<Vote>(Query.EQ("VoteID", voteId)); VoteOption vo = v.AnswerList.Find(x => x.OptionId == optionId); 

The end sets some value for it:

 vo.OptionName = "some option chose"; vo.VoteCount = 1000; 

But I do not know how the next step is to upgrade this vo to Vote parent .

And, if I want to delete this vo , show me this way!

Data in MongoDB:

 { "_id" : "460b3a7ff100", "Question" : "this is question?", "AnswerList" : [{ "OptionId" : "1", "OptionName" : "Option 1", "VoteCount" : 0.0 }, { "OptionId" : "2", "OptionName" : "Option 2", "VoteCount" : 0.0 }, { "OptionId" : "3", "OptionName" : "Option 3", "VoteCount" : 0.0 } }] } 
+4
source share
3 answers

To update a subdocument, you can use this:

 var update = Update.Set("AnswerList.$.OptionName", "new").Set("AnswerList.$.VoteCount", 5); collection.Update(Query.And(Query.EQ("_id", new BsonObjectId("50f3c313f216ff18c01d1eb0")), Query.EQ("AnswerList.OptionId", "1")), update); 

profiler:

 "query" : { "_id" : ObjectId("50f3c313f216ff18c01d1eb0"), "AnswerList.OptionId" : "1" }, "updateobj" : { "$set" : { "AnswerList.$.OptionName" : "new", "AnswerList.$.VoteCount" : 5 } } 

And delete:

 var pull = Update<Vote>.Pull(x => x.AnswerList, builder => builder.EQ(q => q.OptionId, "2")); collection.Update(Query.And(Query.EQ("_id", new BsonObjectId("50f3c313f216ff18c01d1eb0")), Query.EQ("AnswerList.OptionId", "2")), pull); 

profiler:

 "query" : { "_id" : ObjectId("50f3c313f216ff18c01d1eb0"), "AnswerList.OptionId" : "2" }, "updateobj" : { "$pull" : { "AnswerList" : { "OptionId" : "2" } } } 

Another way is to update the parent document with the modified child collection.

+11
source
 // Example function for update like count add like user using c# public PostModel LikeComment(LikeModel like) { PostModel post = new PostModel(); _client = new MongoClient(); _database = _client.GetDatabase("post"); var collection = _database.GetCollection<PostModel>("post"); var _filter = Builders<PostModel>.Filter.And( Builders<PostModel>.Filter.Where(x => x.PostId == like.PostId), Builders<PostModel>.Filter.Eq("Comments.CommentId", like.CommentId)); var _currentLike = collection.Find(Builders<PostModel>.Filter.Eq("PostId", like.PostId)).FirstOrDefault().Comments.Find(f => f.CommentId == like.CommentId).Like; var update = Builders<PostModel>.Update.Set("Comments.$.Like", _currentLike + 1); collection.FindOneAndUpdate(_filter, update); var addUser = Builders<PostModel>.Update.Push("Comments.$.LikeUsers", like.UserId); collection.FindOneAndUpdate(_filter, addUser); var _findResult = collection.Find(_filter).FirstOrDefault(); return _findResult; } 
+2
source
 //Delete comment public PostModel delcomment(int postId, int commentId) { _client = new MongoClient(); _database = _client.GetDatabase("post"); var collection = _database.GetCollection<PostModel>("post"); var filter = Builders<PostModel>.Filter.Eq("PostId", postId); var update = Builders<PostModel>.Update.PullFilter("Comments", Builders<Comments>.Filter.Eq("CommentId", commentId)); collection.FindOneAndUpdate(filter, update); var _findResult = collection.Find(filter).FirstOrDefault(); return _findResult; } 
0
source

All Articles