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提供者隱式創建投影。)