1

我在MongoDB排序数据

string _id; 
string item; 
string category; 
int mobileView; 
int webView; 

我要带10个项目排序由mobileViewwebView总和下降与此文档的集合,反正是有我可以直接通过查询来实现这一点,还是应该获取所有数据并循环遍历所有数据,然后手动将mobileViewwebView相加,然后才能获得总数最高的10个数据?

我一直在阅读关于Aggregation Framework,但据我所知,它Sum只有一个字段被查询分组。如果是的话,我的理解是错误的,如何使用Aggregation Framework来做到这一点。

(我不想ViewSum由同一category进行分组,我也只需要SumView每个项目之前那种吧)

回答

3

的聚合框架是你想要的这里。不仅用于“汇总”,还用于“操纵”文件。所以基本上你需要$add运营商和$sort管道来获得你想要的结果。

带我几分钟时间来启动一个Visual Studio中,所以这里是壳形式,是不是很难翻译:

db.collection.aggregate([ 
    { "$project": { 
     "item": 1, 
     "category": 1, 
     "mobileView": 1, 
     "webView": 1, 
     "totalView": { "$add": [ "$mobileView", "$webView" ] } 
    }}, 
    { "$sort": { "totalView": -1 } } 
]) 

所以基本上“计算”字段,然后使用“投影“作为字段的结果为$sort

只是BSON文件,所以它不应该很难。

专门针对C#语法做这样的事情:

var project = new BsonDocument { 
    { 
     "$project", 
     new BsonDocument() 
      .Add("item", 1) 
      .Add("category", 1) 
      .Add("mobileView", 1) 
      .Add( 
       "totalView", 
       new BsonDocument() 
        .Add("$add", new BsonArray { 
         "$mobileView", "$webView" 
        }) 
      ) 
    } 
}; 

var sort = new BsonDocument { 
    { 
     "$sort", 
     new BsonDocument { 
      { "totalView", -1 } 
     } 
    } 
}; 

var pipeline = new[] { project, sort }; 
var results = collection.Aggregate(pipeline); 

所有$project项目就如同用$group是“明确的”命名字段级输出,包括。在聚合框架中,您想要的字段是“全部或全部”,您必须指定您希望在下一个管道阶段或实际上在管道末端可见的每个字段。就管道而言,未提及的字段不再存在。

认为unix风格的“管道”|您可以将一个命令的结果“链接”到另一个命令,这是对这里发生的事情的明确比喻。

+0

“$ project”和“ 1'在文档中的每个属性中?我应该如[在这里]创建一个新的'BsonDocument'(http://mikaelkoskinen.net/mongodb-aggregation-framework-examples-in-c/)。然后像这样使用Aggregate? 'var results = collection.Aggregate(project).SetSortOrder(SortBy.Descending(“TotalView”))。SetLimit(10).ToList();' – Kyojimaru 2014-09-01 10:26:00

+0

@Kyojimaru在[]中的所有内容都是个人BSON文件。因此,“Aggregate”的参数是BSON文档的“列表”。 LINQ方法在这里不适用,因为所有内容都在“管道”中指定。如果现在很难理解,我可以尝试用简洁的例子来到那里。正如我所说,将需要释放空间并启动Visual Studio来确认语法。所以我花了一些时间来表达我并不总是这样做的事情。 – 2014-09-01 10:30:09

+0

我想我已经知道如何在使用'MongoVue'后使用它,但仍然无法转换为使用'C#'上的语法。将阅读更多关于如何在'C#'明天早晨内正确地编写语法,并感谢指导。如果你可以确认'C#'中的语法,我会非常感激。 – Kyojimaru 2014-09-01 10:52:32

0

我实际上编写了一个Linq提供程序MongoLinqPlusPlus来生成简单的聚合框架管道,比如你的。

因此,与MongoLinqPlusPlus查询简直变成:

collection.QueryablePlusPlus() 
      .Select(c => new { 
       OriginalDoc = c, 
       SortKey = c.mobileView + c.webView 
      }) 
      .OrderByDescending(c => c.SortKey) 
      .Take(10) 
      .Select(c => c.OriginalDoc) 

(*这将是很好,如果我们能在排序做算术(.OrderByDescending(C => c.mobileView + c.webView),但因此我选择要求开发人员明确地创建投影,而不是由Linq提供者隐式创建投影。)