繁体   English   中英

如何使用C#MongoDriver 2.5从BsonDocument中的数组中提取ObjectId

[英]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时,我发现它没有被删除。 每次执行代码并查看ModifiedCountresultPonies时,它都显示为零。 下面是我尝试做的两个示例。

        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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM