如何修复DeleteManyAsync返回使用Filter删除的0条记录?

问题描述 投票:2回答:1

我有一个删除方法,它接收一个IEnumerable的类型为字符串的ID,并使用Filter.In过滤这些ID。但是当传入一组id时,我删除的记录数为0。我的过滤器是否导致问题?

我已经创建了一个测试方法来测试我的删除方法,并传入id以尝试删除它们。


测试Soluton

MongodB删除方法的测试方法

    [Theory]
    [InlineData(1)]
    [InlineData(100)]
    public async void TEST_DELETE(int quantity)
    {
        using (var server = StartServer())
        {
            // Arrange
            var collection = SetupCollection(server.Database, quantity);
            var dataUtility = new MongoDataUtility(server.Database, 
    MongoDbSettings);
            var service = new MongoDatabaseService(dataUtility, Logger);

            var items = 
    collection.FindSync(FilterDefinition<BsonDocument>.Empty)
    .ToIdCollection();
            _output.WriteLine(JsonConvert.SerializeObject(items, 
    Formatting.Indented));

            // Act
            var result = await 
    dataUtility.DeleteIdentifiedDataAsync(items, CollectionName);
            _output.WriteLine(JsonConvert.SerializeObject(result, 
    Formatting.Indented));

            // Assert
            Assert.True(result.DeletedCount.Equals(items.Count));
        }
    }

设置集合

    public IMongoCollection<BsonDocument> SetupCollection(IMongoDatabase db, 
    int quantity)
    {
        var collection = db.GetCollection<BsonDocument>(CollectionName);

        AddCreateDateIndex(collection);
        SeedData(collection, quantity);

        return collection;
    }

种子数据

    public void SeedData(IMongoCollection<BsonDocument> collection, int? 
    quantity = null)
    {
        if (quantity != null && quantity > 0)
        {
            collection.InsertMany(GenerateTestData((int)quantity));
        }
    }

项目

MongoDB删除方法

 public async Task<DeleteResult> 
 DeleteIdentifiedDataAsync(IEnumerable<ObjectId> ids, string Resource, 
 CancellationToken cancellationToken = default)
    {
        var collection = _db.GetCollection<BsonDocument>(Resource);
        var filter = Builders<BsonDocument>.Filter.In("_id", ids);

        if (ids != null && ids.Any() )
        {
            return await collection.DeleteManyAsync(filter, 
 cancellationToken);
        }

        return null;
    }

扩展

    public static ICollection<ObjectId> ToIdCollection(this 
    IAsyncCursor<BsonDocument> @this)
    {
        return @this.Find(Builders<BsonDocument>.Filter.Empty)
            .ToEnumerable()
            .Select(s => s["_id"].AsObjectId)
            .ToList();
    }
c# mongodb filter ienumerable mongodb-.net-driver
1个回答
1
投票

当你运行ToIdCollection时,你的ids方法获得所有的ObjectId,但也将它们从String转换为.Select(dict => dict["_id"].ToString())。运行DeleteManyAsync时,MongoDB会比较值和类型,这就是没有匹配的原因 - 您正在尝试将字符串列表与存储在数据库中的ObjectId进行比较。

要解决此问题,您可以使用以下实现替换ToIdCollection

return @this.Find(Builders<BsonDocument>.Filter.Empty)
                        .ToEnumerable()
                        .Select(s => s["_id"].AsObjectId)
                        .ToList()
© www.soinside.com 2019 - 2024. All rights reserved.