MongoDB C # Удаляет отфильтрованные записи, исключая последние N записей

#c# #mongodb #mongodb-query

#c# #mongodb #mongodb-запрос

Вопрос:

Как я могу удалить отфильтрованные записи из коллекции, исключая последнее N количество записей.

Пример: отфильтруйте по идентификатору, а затем сохраните последние 10 записей и удалите все остальные с этим идентификатором.

Ответ №1:

Вы можете сделать это, сначала отфильтровав строки, затем создав фильтр удаления и, наконец, применив удаление следующим образом. в этом примере использовался MongoDB.Driver для .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);
 

Ответ №2:

вот мое решение с использованием пакета 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);
        }
    }
}
 

отказ от ответственности: я автор библиотеки.