2016-06-21 4 views
0

Unten ist das BSON-Datenformat in Mongodb. Es gibt 300000 Dokumente in der Sammlung.Mongodb C# Adapter 2.2 Abfrage - Top 10 sortiert Ergebnis mit Filterbedingung und begrenzten Spalten

{ 
    "_id" : "90D6F6B3-B4ED-4665-B3E2-09733F340367", 
    "RootID" : "B607F413-E248-430A-910A-304711BA4BD9", 
    "SubRootId" : "C67F493E-82CB-474B-A3B8-B8769E0878E9", 
    "SubRootVersion" : NumberInt(1), 
    "Orders" : [ 
     NumberInt(247), 
     NumberInt(205), 
     NumberInt(279), 
     NumberInt(272), 
     NumberInt(256), 
     NumberInt(236), 
     NumberInt(222), 
     NumberInt(250), 
     NumberInt(287), 
     NumberInt(261), 
     NumberInt(281) 
    ], 
    "SubRootUpdatedDate" : ISODate("2016-06-20T17:15:14.595+0000"), 
    "UniqueNumber" : NumberLong(15410) 
} 
{ 
    "_id" : "09ECF9DE-B26F-49FD-B6BD-61B3A2FF4EF4", 
    "RootID" : "B607F413-E248-430A-910A-304711BA4BD9", 
    "SubRootId" : "C67F493E-82CB-474B-A3B8-B8769E0878E9", 
    "SubRootVersion" : NumberInt(1), 
    "Orders" : [ 
     NumberInt(247), 
     NumberInt(205), 
     NumberInt(279), 
     NumberInt(272), 
     NumberInt(256), 
     NumberInt(236), 
     NumberInt(222), 
     NumberInt(250), 
     NumberInt(287), 
     NumberInt(261), 
     NumberInt(281) 
    ], 
    "SubRootUpdatedDate" : ISODate("2016-06-20T17:15:14.609+0000"), 
    "UniqueNumber" : NumberLong(15411) 
} 
{ 
    "_id" : "038DEB63-196D-4168-9BA8-FA011E14CD09", 
    "RootID" : "919C747A-A024-4615-AFD3-67F86BBD5360", 
    "SubRootId" : "DAEB7FE6-C4BC-4E75-B9AE-AFC1B9999F13", 
    "SubRootVersion" : NumberInt(2), 
    "Orders" : [ 
     NumberInt(211), 
     NumberInt(203), 
     NumberInt(231), 
     NumberInt(260), 
     NumberInt(213), 
     NumberInt(203), 
     NumberInt(200), 
     NumberInt(213), 
     NumberInt(200), 
     NumberInt(233), 
     NumberInt(220), 
     NumberInt(230), 
     NumberInt(297), 
     NumberInt(256) 
    ], 
    "SubRootUpdatedDate" : ISODate("2016-06-20T17:15:09.312+0000"), 
    "UniqueNumber" : NumberLong(15116) 
} 
{ 
    "_id" : "BFCAC497-7206-4EBD-B2E9-F521A90536A5", 
    "RootID" : "919C747A-A024-4615-AFD3-67F86BBD5360", 
    "SubRootId" : "DAEB7FE6-C4BC-4E75-B9AE-AFC1B9999F13", 
    "SubRootVersion" : NumberInt(2), 
    "Orders" : [ 
     NumberInt(211), 
     NumberInt(203), 
     NumberInt(231), 
     NumberInt(260), 
     NumberInt(213), 
     NumberInt(203), 
     NumberInt(200), 
     NumberInt(213), 
     NumberInt(200), 
     NumberInt(233), 
     NumberInt(220), 
     NumberInt(230), 
     NumberInt(297), 
     NumberInt(256) 
    ], 
    "SubRootUpdatedDate" : ISODate("2016-06-20T17:15:09.347+0000"), 
    "UniqueNumber" : NumberLong(15117) 
} 

Nur die Sequenznummer und Filingid sind eindeutig.

Ich benutze den neuesten C# 2.2-Treiber, um mit den folgenden Bedingungen abzufragen.

1) top 10 neuesten rootID Aufzeichnungen (neueste basierend auf SubRootUpdatedDate) 2) Datensätze, die die Auftragsliste 3) zwischen einem SubRootUpdatedDate Datumsbereich

Diese Anpassung ist das, was ich versuchte

var collection = _database.GetCollection<SubRoot>("SubRoots"); 

    var sort = Builders<SubRoot>.Sort.Descending(x => x.UniqueNumber); 
    var sortByDate = Builders<SubRoot>.Sort.Descending(x => x.SubRootUpdatedDate); 
    var filter = Builders<SubRoot>.Filter.In("Orders", new list<int> { 255, 256 , 299, 281}); 
    filter &= Builders<SubRoot>.Filter.Gt(y => y.SubRootUpdatedDate, minDate); 
    filter &= Builders<SubRoot>.Filter.Lt(y => y.SubRootUpdatedDate, maxDate); 

    var projection = Builders<SubRoot>.Projection 
     .Exclude(x => x.SubRootUpdatedDate) 
     .Exclude(x => x.SubRootId) 
     .Exclude(x => x.UniqueNumber) 
     .Exclude(x => x._id) 
     .Exclude(x => x.Orders) 
     .Exclude(x => x.SubRootVersion); 

    return collection.Find(filter).Sort(sort).Sort(sortByDate).Project(projection).ToList(); 

I Ich bin nicht in der Lage, nach der Verwendung von Filter und Sortierung ein eindeutiges zu tun. Außerdem kann ich das Ergebnis nicht auf 10 beschränken, bevor ich einen Tolist() mache. Ich möchte das Filtern, Sortieren und Begrenzen der Daten in mongodb durchführen. Ich möchte nur die 10 IDs zurückbringen, die den Suchkriterien entsprechen. Ich habe genug Zeit damit verbracht und würde mich über Vorschläge freuen.

Antwort

1

Ich habe die Antwort selbst gefunden.

var aggregate = collection.Aggregate() 
     .Match(Builders<Filing>.Filter.In("Orders", ordersList)) 
     .Match(x => x.UniqueNumber>= UniqueNumberList) 
     .Match(Builders<Filing>.Filter.Gt(y => y.SubRootUpdatedDate, minDate)) 
     .Match(Builders<Filing>.Filter.Lt(y => y.SubRootUpdatedDate, maxDate)) 
     .Sort(Builders<Filing>.Sort.Descending(x => x.UniqueNumber)) 
     .Sort(Builders<Filing>.Sort.Descending(x => x.SubRootUpdatedDate)) 
     .Group(z => z.RootID, h => new { h.Key }) 
     .Limit(limitValue) 
     .ToList();