gpt4 book ai didi

c# - 如何修复 DeleteManyAsync 返回使用过滤器删除的 0 条记录?

转载 作者:可可西里 更新时间:2023-11-01 10:36:53 25 4
gpt4 key购买 nike

我有一个 delete 方法,它接受一个 IEnumerable 类型的 ID,并有一个过滤器使用 Filter.In 接受这些 ID。但是,当传递一组 id 时,我得到的已删除记录计数为 0。是我的过滤器导致了这个问题吗?

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


测试解决方案

删除方法的MongodDB测试方法

    [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();
}

最佳答案

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

要解决这个问题,您可以将 ToIdCollection 替换为以下实现:

return @this.Find(Builders<BsonDocument>.Filter.Empty)
.ToEnumerable()
.Select(s => s["_id"].AsObjectId)
.ToList()

关于c# - 如何修复 DeleteManyAsync 返回使用过滤器删除的 0 条记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55635485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com