MongoDB中的ROW_NUMBER()和RANK()

时间:2012-07-14 00:39:22

标签: mongodb mongodb-.net-driver

我有一个带有以下架构的产品表

 (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 个答案:

答案 0 :(得分:1)

此查询将要求您构建map / reduce。点击此处的文档:http://www.mongodb.org/display/DOCS/MapReduce

如果你需要一些帮助来构建map / reduce,请告诉我,我会尽我所能。我鼓励你先自己尝试一下。请注意,map / reduce不是用于实时查询,因此您需要对结果进行快照,这意味着您正在处理最终一致的数据,并且业务需要了解它并且可以使用它。

此外,可能会根据您的需要针对此类查询优化您的架构。以与将其存储在关系数据库中相同的方式存储在mongodb中的数据几乎不是正确的选择。如果这是正确的选择,那么无论如何你都应该坚持使用关系模型。