MongoDb C#驱动程序-DeleteMany不适用于In Filter

问题描述

我尝试使用MongoDb C#驱动程序删除重复的记录。下面的脚本既不会引发错误,也不会删除任何记录。有什么建议吗?

[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来保留并删除其余的ID,如下所示:

class LocationSerializer(serializers.ModelSerializer):

    class Meta:
        model = Location
        fields = ['name','address','address2','city','state','zip_code']

作为旁注,我建议您将ID以var filter = Builders<ApiUsers>.Filter.Where(u => u.UserEMail == "[email protected]"); 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 == "[email protected]" && u.Id != idToKeep); 而不是字符串的形式存储在服务器中,因为效率较低,因为ObjectId仅需要12个字节来存储,这将小于十六进制字符串表示形式

这是一个使用mongodb.entities的繁琐测试程序:

ObjectId