如何使用c#驱动程序删除mongodb文档中的嵌套数组元素



我是MongoDB世界的新手,现在我正在为如何删除、更新文档嵌套数组字段中的元素而苦苦挣扎。这是我的样本文件:

{
    "_id" : ObjectId("55f354533dd61e5004ca5208"),
    "Name" : "Hand made products for real!",
    "Description" : "Products all made by hand",
    "Products" : [ 
        {
            "Identifier" : "170220151653",
            "Price" : 20.5,
            "Name" : "Leather bracelet",
            "Description" : "The bracelet was made by hand",
            "ImageUrl" : "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcQii6JCvXtx0iJGWgpvSl-KrdZONKYzDwS0U8uDvUunjO6BO9Aj"
        }
    ]
} 

在我的方法中,我获取文档的id和要删除的产品的id(Identifier)。有人能告诉我如何从"产品"字段中删除标识符为170220151653的元素吗?

我试过了:

var query = Query.And(Query.EQ("_id", categoryId), Query.EQ("Products.Identifier", productId));
var update = Update.Pull("Products", new BsonDocument() { { "Identifier", productId } });
myDb.Applications().Update(query, update);

如这里所建议的:MongoDB从子文档中删除子文档文档

但我在上出错了

myDb.Applications()

就是找不到。

已解决:

var pull = Update<Category>.Pull(x => x.Products, builder => builder.EQ(q => q.Identifier, productId));
collection.Update(Query.And(Query.EQ("_id", ObjectId.Parse(categoryId)), Query.EQ("Products.Identifier", productId)), pull);

您正在调用方法Pull(string name, MongoDB.Bson.BsonValue value),根据文档,它是

从命名数组元素中删除所有等于价值(见$pull)

并且您提供CCD_ 2作为值。我猜mongo没有找到精确的值。

尝试将Pull的第二个重载与查询条件一起使用,而不是使用精确值

从命名数组元素中删除与某个查询匹配的所有值(参见$pull)。

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

更新

由于您提到了Category实体,因此我可以建议使用lambda而不是Query.EQ:

var pull = Update<Category>.Pull(x => x.Products, builder =>
builder.Where(q => q.Identifier == productId));

使用C#MongoDB驱动程序的解决方案。删除单个嵌套元素。

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

我也面临着同样的问题,最后在做了大量的R&D、 我知道,当你想使用过滤器删除时,你必须使用PullFilter而不是Pull。

我也有从嵌套数组中删除元素的方法,但经过研究,我发现了这段有效的代码。

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;

嗨,根据我的理解,你想删除给定id和标识符的所有匹配元素,所以下面的查询将解决你的问题,但我不知道如何将其转换为C#,这里使用mongo$pull方法。

db.collectionName.update({"_id" : ObjectId("55f354533dd61e5004ca5208")}, {"$pull":{"Products":{"Identifier":"170220151653"}}})

C#MongoDB驱动程序解决方案。您可以将空的[]设置为嵌套数组。

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

最新更新