¿Cómo puedo eliminar registros filtrados de una colección excluyendo el último número N de registros?
Ejemplo: filtre por Id y luego conserve los últimos 10 registros y elimine todos los demás con esa Id.
Puede hacerlo filtrando primero las filas, luego creando un filtro de eliminación y finalmente aplicando la eliminación de la siguiente manera. esta muestra ha usado MongoDb.Driver para .net.
var listFilter = Builders<Entity>.Filter.Eq(s => s.SomeProp, X); SortDefinition<Entity> sortDefinition = Builders<Entity>.Sort.Ascending(a => a.SomeProp); List<Entity> itemsAfterSkip = await this.DbSet.Find(listFilter).Sort(sortDefinition).Skip(10).Limit(10).ToListAsync(); FilterDefinition<Entity> deleteFilter = null; foreach (var item in itemsAfterSkip) { if (deleteFilter == null) { deleteFilter = MongoDB.Driver.Builders<Entity>.Filter.Eq(s => s.Id, item.Id); } else { deleteFilter = deleteFilter | MongoDB.Driver.Builders<Entity>.Filter.Eq(s => s.Id, item.Id); } } await DbSet.DeleteManyAsync(deleteFilter);aquí está mi solución usando el paquete MongoDB.Entities:
using MongoDB.Driver; using MongoDB.Driver.Linq; using MongoDB.Entities; using System.Collections.Generic; using System.Threading.Tasks; namespace TestApplication { public class Person : Entity { public string Name { get; set; } public int NIC { get; set; } } public static class Program { private static async Task Main() { await DB.InitAsync("test"); var people = new List<Person>(); for (int i = 1; i <= 20; i++) { people.Add(new Person { Name = $"person {i}", NIC = i }); } await people.SaveAsync(); var idsToDelete = await DB.Queryable<Person>() .OrderByDescending(p => p.ID) .Skip(10) .Select(p => p.ID) .ToListAsync(); await DB.DeleteAsync<Person>(idsToDelete); } } }descargo de responsabilidad: soy el autor de la biblioteca.