mongodb按动态属性排序

时间:2017-08-06 21:22:21

标签: node.js mongodb mongoose aggregation-framework

我正在使用node和mongoose构建应用程序。我有这个模型

{
    price: Number,
    price_special: Number,
    price_special_from: DateTime,
    price_special_to: DateTime
}

我很好奇我是否可以使用聚合框架按当前价格对集合进行排序。当前价格应该像这样计算

function(model){
    if(now > model.price_special_from && now < model.price_special_to) {
        return model.price_special;
    } else {
        return model.price;
    }
}

我需要在大型集合上运行此类,因此我无法在应用程序中执行此操作。我想到的唯一方法是让计数属性由cron更新。这不是最佳的。 Plase建议如何为此案例构建$project查询。

更新

我解决了这个问题&#34;重复&#34;使用聚合框架的问题。我将$cond运算符与$and运算符结合使用。

db.getCollection('products').aggregate(
    [
        {
            $project:
            {
                price: 1,
                price_special: 1,
                price_special_from: 1,
                price_special_to: 1,
                current_price:
                {
                    $cond: { if: {
                        $and: [
                            {$ne: ["$price_special", null]},
                            {$ne: ["$price_special_to", null]},
                            {$ne: ["$price_special_from", null]},
                            {$gt: [new Date(),"$price_special_from"]},
                            {$lt: [new Date(),"$price_special_to"]}
                        ]
                    },
                        then: "$price_special",
                        else: "$price"
                    }
                }
            }

        },{ $limit : 100 }
    ]
)

0 个答案:

没有答案