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

时间:2015-02-18 13:46:56

标签: c# mongodb crud

我是Mongodb世界的新手,现在我正在努力如何删除,更新文档的嵌套数组字段中的元素。这是我的samle文件:

{
    "_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和我想要删除的Product的id(Identifier)。任何人都可以告诉我如何从Products字段中删除具有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 remove a subdocument document from a subdocument

但我在

收到错误
  

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

6 个答案:

答案 0 :(得分:11)

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

  

从指定的数组元素中删除等于某些值的所有值   价值(见$ pull)

并提供{ "Identifier", productId }作为值。我猜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));

答案 1 :(得分:3)

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

答案 2 :(得分:1)

根据我的理解,您希望删除给定ID和标识符的所有匹配元素,因此下面的查询可能会解决您的问题,但我不知道如何将其转换为C#,这里是mongo { {3}}使用方法。

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

答案 3 :(得分:1)

我也遇到了同样的问题,最后经过大量研发后,我开始知道,当你想使用过滤器删除时,你必须使用PullFilter而不是Pull。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我具有从嵌套数组中删除元素的功能,但是经过研究,我发现了这段工作代码。

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;