如何使用C#mongodriver 2.5从bsondocument中的数组中拉出objectid



我正在尝试通过JavaScript代码进行移植,该代码与mongodb交互到c#.net,并且在删除/拉动操作方面存在问题。我似乎无法弄清楚如何通过 Ponies 数组进行迭代,并通过匹配与ObjectID中传递的一个objectid删除单个objectid。

{
    "_id" : ObjectId("388e8a66fe2af4e35c60e"),
    "Location" : "rainbowland",
    "Ponies" : [ 
        ObjectId("388e8a66fe2af4e35c24e83c"), 
        ObjectId("388e8a66fe2af4e35c24e860"), 
        ObjectId("388e8a66fe2af4e35c24e83d")
    ]
}

我尝试了几种不同的方法,这些方法是根据我在网上找到的,但似乎没有任何作用。当我检查集合以查看 388E8A66FE2AF4E35C24E860 是否被从Ponies阵列中删除,我发现它没有删除。每次我执行代码并查看 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中的objectids,我需要找到数组中的值与给定的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);

最新更新