Mongodb c#adapter 2.2 query - 具有过滤条件和有限列的前10个排序结果

时间:2016-06-21 18:35:46

标签: c# mongodb mongodb-.net-driver

以下是mongodb中的BSON数据格式。该系列中有300000个文件。

{ 
    "_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)
}

只有sequencenumber和filingid是唯一的。

我使用最新的c#2.2驱动程序来查询以下条件。

1)前10个最新RootId记录(最新基于SubRootUpdatedDate) 2)匹配订单列表的记录 3)SubRootUpdatedDate日期范围

之间

这就是我试过的

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

使用过滤器和排序后,我无法做出明显的分析。此外,在执行Tolist()之前,我无法将结果限制为10。我希望所有过滤,排序和限制数据都在mongodb中完成。我想只带回与搜索条件匹配的10个id。我已经花了足够的时间,我很感激任何建议。

1 个答案:

答案 0 :(得分:1)

我自己找到了答案。

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