2012-02-17 7 views
8

Próbuję pobrać pięć ostatnich dokumentów z kolekcji "Deal" w MongoDB za pomocą sterownika C# dla MongoDB. Mogę to zrobić za pomocą poniższego kodu.Jak napisać zapytanie o "orderby" w sterowniku Mongo dla C# do sortowania?

public IList<TEntity> GetRecentFive() 
{ 
    IList<TEntity> entities = new List<TEntity>(); 
    using (MongoDbContext dbContext = new MongoDbContext(_dbFactory)) 
    { 
     var cursor = dbContext.Set<TEntity>().FindAll().SetSortOrder(SortBy.Descending("ModifiedDateTime")).SetLimit(5); 

     foreach (TEntity entity in cursor) 
     { 
      entities.Add(entity); 
     } 
    } 

    return entities; 
} 

Ale chcę uzyskać tylko ostatnich 5 dokumentów i FindAll() ładuje wszystkie dokumenty w kolekcji. Próbowałem zrobić to za pomocą funkcji Znajdź(), ale jako parametr wymagane jest zapytanie. Jak napisać zapytanie "orderby" w sterowniku Mongo, aby C# sortowało?

https://stackoverflow.com/a/2148479/778101 zadał podobne pytanie tutaj. Ale zaakceptowana odpowiedź nie działa dla mnie.

Odpowiedz

10
using (MongoDbContext dbContext = new MongoDbContext(_dbFactory)) 
{ 
    var query = new QueryDocument(); 

    var cursor = 
     dbContext.Set<TEntity>().Find(query).SetSortOrder(SortBy.Descending("ModifiedDateTime")).SetLimit(5); 

    foreach (TEntity entity in cursor) 
    { 
     entities.Add(entity); 
    } 
} 

jest również właściwa metoda, aby rozwiązać ten problem

0

Powinieneś użyć metody Znajdź. Query.And() w języku C# będzie odpowiadać pustemu zapytaniu {} w powłoce mongodb. Tak pełne przykładem będzie wygląda następująco:

dbContext.Set<TEntity>() 
     .Find(Query.And()) 
     .SetSortOrder(SortBy.Descending("ModifiedDateTime")) 
     .SetLimit(5); 

Właściwie jeśli zbiór silny wpisane mieć metodę Find(IMongoQuery query), jeśli nie to mieć metodę FindAs<Type>(IMongoQuery query).

1

Można użyć MongoDB.Driver.Builders.Query.Null jako parametr IMongoQuery dla find() i niż zrobić SetSortOrder().SetLimit()

Twój kod może być jak

 
dbContext.Set() 
     .Find(Query.Null).SetSortOrder(SortBy.Descending("ModifiedDateTime")) 
     .SetLimit(5); 
0

FindAll to skrót do Find (Query.Null).

Nie ma powodu, dla którego nie można używać SetSortOrder i SetLimit z FindAll.

2

Wygląda na to, że zaakceptowana odpowiedź jest nieaktualna lub nie rozumiem jej. Oto sposób, w jaki zamawiasz w MongoDb C# Driver 2.0:

var list = await collection 
        .Find(fooFilter) 
        .Sort(Builders<BsonDocument>.Sort.Descending("NameOfFieldToSortBy") 
        .ToListAsync();