[英]How to pull ObjectId from an Array in a BsonDocument with C# MongoDriver 2.5
我正在尝试将与MongoDb交互的JavaScript代码移植到C#.NET,并且存在删除/拉操作的问题。 我似乎无法弄清楚如何遍历Ponies数组并通过匹配传入的ObjectId来删除单个ObjectId。
{
"_id" : ObjectId("388e8a66fe2af4e35c60e"),
"Location" : "rainbowland",
"Ponies" : [
ObjectId("388e8a66fe2af4e35c24e83c"),
ObjectId("388e8a66fe2af4e35c24e860"),
ObjectId("388e8a66fe2af4e35c24e83d")
]
}
根据我在网上找到的内容,我尝试了几种不同的方法,但似乎无济于事。 当我检查集合以查看是否从Ponies数组中删除了388e8a66fe2af4e35c24e860时,我发现它没有被删除。 每次执行代码并查看ModifiedCount的resultPonies时,它都显示为零。 下面是我尝试做的两个示例。
var pony = new Pony() { Id = new ObjectId("388e8a66fe2af4e35c24e860") }
var pullPonies = Builders<Ranch>.Update.PullFilter(x => x.Ponies,
y => y.Id == pony.Id);
var filterPonies = Builders<Ranch>.Filter.Where(x => true);
var resultPonies = _context.Ranches.UpdateMany(filterPonies, pullPonies);
要么
var pullPonies = Builders<BsonDocument>.Update.PullFilter("Ponies",
Builders<ObjectId>.Filter.Eq("ObjectId", pony.Id));
var filterPonies = Builders<BsonDocument>.Filter.Where(x => true);
var resultPonies = _context.Ranches.UpdateMany(filterPonies, pullPonies);
这是我认为可以但尚未进行测试的JavaScript代码。
db.collection("Ranches").update({}, {$pull: {Ponies: pony._id}}, {multi: true});
好的,我找到了解决问题的方法。 由于我实际上并不会在对象数组中进行过滤,因此它们都是BsonArray中的所有ObjectId,因此我需要找到数组中值与给定ObjectId匹配的位置。 在这种情况下,应将阵列项目拉出。 如果数组中的对象具有其他属性,那么我可能想使用PullFilter。 但是在这种情况下,我不需要过滤其他级别。 至少这是我认为我做错了的事情。 这是解决方案
var ponyId = new ObjectId("388e8a66fe2af4e35c24e860");
var pullPonies = Builders<Ranch>.Update.Pull(x => x.Ponies, ponyId);
// This line is to retrieve all Ranch objects in the collection
var filterPonies = Builders<Ranch>.Filter.Where(x => true);
var resultPonies = _context.Ranches.UpdateMany(filterPonies, pullPonies);
要么
var ponyId = new ObjectId("388e8a66fe2af4e35c24e860");
var pullPonies = Builders<BsonDocument>.Update.Pull("Ponies", ponyId));
// This line is to retrieve all Ranch objects in the collection
var filterPonies = Builders<BsonDocument>.Filter.Where(x => true);
var resultPonies = _context.Ranches.UpdateMany(filterPonies, pullPonies);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.