c# - MongoDb C# 驱动程序 - DeleteMany 不适用于 In Filter
问题描述
我尝试使用 MongoDb C# Driver 删除重复记录。下面的脚本既不会引发错误,也不会删除任何记录。有什么建议吗?
[BsonIgnoreExtraElements]
public class ApiUsers
{
[BsonId]
[BsonRepresentation(BsonType.String)]
public ObjectId Id { get; set; }
public string UserEMail { get; set; }
}
var users = _mongoDbContext.ApiUsers.Find(f => f.UserEMail == email).ToList();
var oneUser = users[0];
var idsToDelete = users.Where(x => !x.Id.Equals(oneUser.Id)).Select(x => x.Id);
if (idsToDelete.Any())
{ //Delete Dublicates
var idsToDeleteFilter = Builders<ApiUsers>.Filter.In(t => t.Id, idsToDelete);
var result = _mongoDbContext.ApiUsers.DeleteMany(idsToDeleteFilter);
}
我也尝试过像下面这样的 DeleteOne 方法,但它也不起作用,
foreach (var idToDelete in idsToDelete)
_mongoDbContext.ApiChildUsers.DeleteOne(Builders<ApiChildUsers>.Filter.Eq(u => u.Id, idToDelete));
解决方案
您可以尝试以下方法,您可以返回一个 Id 以保留并删除其余部分,如下所示:
var filter = Builders<ApiUsers>.Filter.Where(u => u.UserEMail == "test@test.com");
var projection = Builders<ApiUsers>.Projection.Expression(u=>u.Id);
var options = new FindOptions<ApiUsers, string> { Projection = projection, Limit = 1 };
var idToKeep = collection.FindSync(filter, options).ToList()[0];
collection.DeleteMany(
u => u.UserEMail == "test@test.com" &&
u.Id != idToKeep);
作为旁注,我建议您将 ID 存储在服务器中ObjectId
而不是字符串,因为它的效率较低,因为 ObjectId 只需要 12 个字节来存储,这将小于它的十六进制字符串表示形式。
这是一个使用 mongodb.entities 的不太冗长的测试程序:
using MongoDB.Entities;
using System.Threading.Tasks;
namespace TestApp
{
public class ApiUsers : Entity
{
public string UserEMail { get; set; }
}
internal static class Program
{
private static async Task Main()
{
await DB.InitAsync("test", "localhost");
await new[] {
new ApiUsers { UserEMail = "test@test.com"},
new ApiUsers { UserEMail = "test@test.com"},
new ApiUsers { UserEMail = "test@test.com"},
new ApiUsers { UserEMail = "teX@teX.com"},
}.SaveAsync();
var idToKeep = (await DB.Find<ApiUsers, string>()
.Match(u => u.UserEMail == "test@test.com")
.Project(u => u.ID)
.Limit(1)
.ExecuteAsync())[0];
await DB.DeleteAsync<ApiUsers>(
u => u.UserEMail == "test@test.com" &&
u.ID != idToKeep);
}
}
}
推荐阅读
- python - Python InfluxDB2 - write_api.write(...) 如何检查是否成功?
- box-api - 在 Box API 中使用 App Token Auth 支持的端点
- postgresql - 从大型数据集中逐行输入数据到超表(Postgre)
- mysql - 列表中所有项目的 Where 子句
- autosar - 计划表的显式同步有多准确?
- reactjs - 由于泛型的打字稿性质,无法分配道具
- ruby-on-rails - 发布请求以存储高分
- android - 带有 DatePickerDialog 片段的片段
- python - 如何将数字四舍五入为整数?
- powershell - 如何使用 CSV 创建本地用户并将它们放在一个组中