How can I delete nested array element in a mongodb document with the c# driver

前端 未结 6 1739
没有蜡笔的小新
没有蜡笔的小新 2021-02-14 08:21

I am new in the MongoDB world and now I am struggling of how can I delete, update element in a nested array field of a document. Here is my sample document:

{
           


        
相关标签:
6条回答
  • 2021-02-14 08:34

    I was also facing the same problem and then finally after doing lot of R&D, I came to know that, you have to use PullFilter instead of Pull when you want to delete using filter.

    0 讨论(0)
  • 2021-02-14 08:35

    Solution for C# MongoDB Driver. You can set empty [] the nested array.

    var filter = Builders<MyUser>.Filter.Where(mu => mu.Id == "my user id");
    var update = Builders<MyUser>.Update.Set(mu => mu.Phones, new List<Phone>());
    _repository.Update(filter, update);
    
    0 讨论(0)
  • 2021-02-14 08:37

    You are calling method Pull(string name, MongoDB.Bson.BsonValue value) and according to the docs it

    Removes all values from the named array element that are equal to some value (see $pull)

    and you provide { "Identifier", productId } as the value. I guess that mongo does not find that exact value.

    Try to use the second overload of Pull with query-condition instead of exact value

    Removes all values from the named array element that match some query (see $pull).

    var update = Update.Pull("Products", Query.EQ("Identifier", productId));
    

    UPDATE

    Since you mention Category entity so I can suggest using lambda instead of Query.EQ:

    var pull = Update<Category>.Pull(x => x.Products, builder =>
    builder.Where(q => q.Identifier == productId));
    
    0 讨论(0)
  • 2021-02-14 08:44

    Solution with C# MongoDB Driver. Delete a single nested element.

    var filter = Builders<YourModel>.Filter.Where(ym => ym.Id == ymId);
    var update = Builders<YourModel>.Update.PullFilter(ym => ym.NestedItems, Builders<NestedModel>.Filter.Where(nm => nm.Id == nestedItemId));
    _repository.Update(filter, update);
    
    0 讨论(0)
  • 2021-02-14 08:51

    Hi as per my understanding you want to remove whole matched elements of given id and identifier so below query will solve your problem but I don't know how to convert this into C#, here mongo $pull method used.

    db.collectionName.update({"_id" : ObjectId("55f354533dd61e5004ca5208")}, {"$pull":{"Products":{"Identifier":"170220151653"}}})
    
    0 讨论(0)
  • 2021-02-14 08:57

    I had the same of deleting elements from the nested array but after research, I found this piece of working code.

    var update = Builders<Category>.Update.PullFilter(y => y.Products, builder => builder.Identifier== productId);
    var result = await _context.Category.UpdateOneAsync(filter, update);
    return result.IsAcknowledged && result.ModifiedCount > 0;
    
    0 讨论(0)
提交回复
热议问题