问题描述
我尝试使用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