2016-06-29 7 views
1

Meine Klasse:MongoDB C# skip-Limit für verschachtelten Array

class Product 
{ 
    public string _id {get; set;} 
    public IEnumerable<Item> Items {get; set;} 
    public int ItemsCount {get; set;} 
} 

class Item 
{ 
    public string Name {get; set;} 
} 

Ich brauche Items auszuwählen nur und Prozess skip limit (Paging) für sie. Count I kann im Objekt speichern. Ist es möglich, mongo dafür zu verwenden, oder sollte ich Elemente in eine andere Sammlung legen?

Antwort

1

können wir zwei Szenarien haben sich hier:

  1. Wir sind immer ein Hauptdokument beantragt und müssen skip/Limit auf diesem Feld haben.

  2. Wir fordern eine unbekannte Anzahl von Dokumenten an und dann könnten wir eine Art von zusammengeführten Array von allen Quellen überspringen/begrenzen.

Beide Lösungen werden mit Aggregations Rahmen mit $unwind Bühne, die diffrence ist, dass $match in erster Fall immer nur ein Dokument zurückgibt (lassen Sie uns von objectId abgestimmt sagen). mit $group Server-Seite oder iterieren und Prozess in C# -Code

var aggregate = collection.Aggregate().Match(x => x.Id == ourNeededId) 
    .Unwind("Items").Skip(3).Limit(3).Project<Product>(project); 

Als Ausgabe werden wir drei Dokumente erhalten, die wir können, a) verschmelzen.

EDIT

 var aggregate = 
      collection.Aggregate() 
       .Match(x => x._id == "some id here") 
       .Unwind("Items") 
       .Skip(3) 
       .Limit(3) 
       .Group(BsonDocument.Parse("{_id:{id:'$_id', ItemsCount:'$ItemsCount' },Items:{$push:'$Items'} }")) 
       .Project<Product>(BsonDocument.Parse("{_id:'$_id.id', ItemsCount:'$_id.ItemsCount', Items:1 }")) 
       .ToList(); 

Alle Kommentare willkommen!

+0

Vielen Dank! Könnten Sie bitte ein Beispiel für einen Gruppencode geben? –

+0

@AlexGurskiy finden Sie 'schnell' bearbeiten – profesor79

+0

Danke für Ihre Zeit! –

Verwandte Themen