如何使用 c# 驱动程序删除 mongodb 文档中的嵌套数组元素
How can I delete nested array element in a mongodb document with the c# driver
我是 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(标识符)。谁能告诉我如何从“产品”字段中删除标识符为: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);
您好,根据我的理解,您想要删除给定 ID 和标识符的整个匹配元素,因此下面的查询将解决您的问题,但我不知道如何将其转换为 C#
,此处 [=15] =] $pull 使用的方法。
db.collectionName.update({"_id" : ObjectId("55f354533dd61e5004ca5208")}, {"$pull":{"Products":{"Identifier":"170220151653"}}})
您正在调用方法 Pull(string name, MongoDB.Bson.BsonValue value)
并且根据文档
Removes all values from the named array element that are equal to some
value (see $pull)
并且您提供 { "Identifier", productId }
作为值。我猜 mongo 没有找到 确切的 值。
尝试将 Pull
的第二个重载与查询条件一起使用,而不是使用精确值
Removes all values from the named array element that match some query
(see $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));
我也遇到了同样的问题,经过大量的研发,我终于知道,当你想使用过滤器删除时,你必须使用 PullFilter 而不是 Pull。
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);
我也曾从嵌套数组中删除元素,但经过研究,我发现了这段工作代码。
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;
使用 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);
我是 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(标识符)。谁能告诉我如何从“产品”字段中删除标识符为: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);
您好,根据我的理解,您想要删除给定 ID 和标识符的整个匹配元素,因此下面的查询将解决您的问题,但我不知道如何将其转换为 C#
,此处 [=15] =] $pull 使用的方法。
db.collectionName.update({"_id" : ObjectId("55f354533dd61e5004ca5208")}, {"$pull":{"Products":{"Identifier":"170220151653"}}})
您正在调用方法 Pull(string name, MongoDB.Bson.BsonValue value)
并且根据文档
Removes all values from the named array element that are equal to some value (see $pull)
并且您提供 { "Identifier", productId }
作为值。我猜 mongo 没有找到 确切的 值。
尝试将 Pull
的第二个重载与查询条件一起使用,而不是使用精确值
Removes all values from the named array element that match some query (see $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));
我也遇到了同样的问题,经过大量的研发,我终于知道,当你想使用过滤器删除时,你必须使用 PullFilter 而不是 Pull。
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);
我也曾从嵌套数组中删除元素,但经过研究,我发现了这段工作代码。
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;
使用 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);