我有一个带有以下架构的产品表
(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
答案 0 :(得分:1)
此查询将要求您构建map / reduce。点击此处的文档:http://www.mongodb.org/display/DOCS/MapReduce。
如果你需要一些帮助来构建map / reduce,请告诉我,我会尽我所能。我鼓励你先自己尝试一下。请注意,map / reduce不是用于实时查询,因此您需要对结果进行快照,这意味着您正在处理最终一致的数据,并且业务需要了解它并且可以使用它。
此外,可能会根据您的需要针对此类查询优化您的架构。以与将其存储在关系数据库中相同的方式存储在mongodb中的数据几乎不是正确的选择。如果这是正确的选择,那么无论如何你都应该坚持使用关系模型。