#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);
}
}
}
отказ от ответственности: я автор библиотеки.