2012-02-17 1 views
8

Sto cercando di recuperare cinque documenti recenti dalla raccolta "Deal" in un MongoDB usando il driver C# per MongoDB. Posso farlo con il codice qui sotto.Come scrivere una query per "orderby" nel driver Mongo per C# per ordinare?

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; 
} 

ma voglio ottenere solo i recenti 5 documenti e carichi FindAll() tutti i documenti della collezione. Ho provato a farlo con Find() ma ha bisogno di una query come parametro. Come posso scrivere una query per "orderby" nel driver Mongo per C# per ordinare?

https://stackoverflow.com/a/2148479/778101 ha posto una domanda simile qui. Ma la risposta accettata non funziona per me.

risposta

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); 
    } 
} 

è anche un metodo corretto per risolvere questo problema

0

È necessario utilizzare il metodo Trova. Query.And() in C# sarà equivalente alla query vuota {} nella shell mongodb. Così pieno esempio si presenta così:

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

In realtà se si collezione forte digitata avere metodo Find(IMongoQuery query), se poi non hanno il metodo FindAs<Type>(IMongoQuery query).

1

È possibile utilizzare MongoDB.Driver.Builders.Query.Null come parametro di IMongoQuery per find() e poi fare lo SetSortOrder().SetLimit()

Il codice può essere come

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

FindAll è solo una scorciatoia per Trova (Query.Null).

Non c'è alcun motivo per cui non è possibile utilizzare SetSortOrder e SetLimit con FindAll.

2

Sembra che la risposta accettata non sia aggiornata o non la capisco. Ecco come si ordina in MongoDb C# Driver 2.0:

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