2012-07-14 47 views
0

我有以下模式ROW_NUMBER()和RANK()在MongoDB中

(ProductID INT, ProductStartDate date, ProductExpDate date, 
ProductTypeID int, #PacketsInProduct int, 
Price int, Discount int, Score int) 

我需要編寫一個查詢像這樣在MongoDB中一個產品表。我正在使用C#驅動程序1.5。我在下面的第一個CTE(Products_CTE)中遇到了問題,其中Row_NUMBER()根據我需要篩選第二個CTE中的行的排名來決定產品排名,該排名與我的where條件相匹配。我的所有條件都是動態的,任何人都可以在這裏幫助我。在此先感謝

;WITH Products_CTE 
      AS 
      (
       SELECT 
        ROW_NUMBER() OVER(PARTITION BY ProductID ORDER BY Score Desc, Price Asc) as RankByProduct, 
        * 
       FROM Products 
        WHERE 
          ProductID IN (1,2,3) 
          AND ProductTypeID IN (001,002) 
          AND [#PacketsInProduct] >3 and [#PacketsInProduct] <10 
         and ProductExpDate < GETDATE() 

      ), 
      Products2_CTE 
      AS 
      (
       SELECT 
        ROW_NUMBER() OVER (ORDER BY Score DESC, Price ASC) as rownum, 
        * 
       FROM Products_CTE 
       WHERE RankByProduct <= 3 
      ) 
      SELECT 
       * 
        from Products2_CTE cte1 
      where rownum BETWEEN 15 AND 25 
       ORDER BY [Score] DESC, [Price] ASC 

回答

1

此查詢將要求您生成地圖/減少。點擊此處查看文檔:http://www.mongodb.org/display/DOCS/MapReduce

如果您在構建地圖/縮減時需要一些幫助,請告訴我,我會盡我所能。不過,我鼓勵你先嚐試一下。請注意,map/reduce不是用於實時查詢的,因此您需要對結果進行快照,這意味着您正在處理最終一致的數據,業務需要了解它並與其保持一致。

此外,根據您的需要,您的架構可能會針對此類查詢進行優化。以存儲在關係數據庫中的方式將數據存儲在mongodb中幾乎從來都不是正確的選擇。如果這是正確的選擇,那麼無論如何你都應該堅持使用關係模型。

+0

感謝您的回覆。我曾嘗試過Map/Reduce,但無法弄清楚如何獲得排名。我正在爲我的實時網站構建這個網站,在這種排名,分組的情況下,你會不會建議去MongoDB?如何選擇cassendra在這裏,會有幫助嗎?關於我的表的架構,它是一個列很少的普通表,我沒有看到架構中有什麼要改變,有什麼意見?再次感謝... – 2012-07-14 01:57:34

+0

所以,我想我的問題是爲什麼你想要一個nosql解決方案。你顯然有一個非常小的模式的工作解決方案。 如果你想使用mongodb,你會這樣做的方式是保持數據非規範化和更新,因爲它改變,而不是在查詢點聚合。可以說,它會非常快,因爲不需要進行計算。 – 2012-07-14 13:49:11