0

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

 (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
4

1 回答 1

1

此查询将要求您构建一个 map/reduce。在此处查看文档:http ://www.mongodb.org/display/DOCS/MapReduce 。

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

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

于 2012-07-14T01:39:53.623 回答