使用Nodejs

时间:2016-02-08 12:09:30

标签: node.js mongodb mongoose mongodb-query

不要创建价格范围使用mongodb聚合管道.. 使用弹性搜索或solr我们可以直接获得价格过滤范围值...如何根据我的产品价格创建价格范围,如果该范围内没有产品则不创建该范围...

{ 
    "_id" : ObjectId("5657412ddb70397479575d1d"),"price" : 1200
},
{ 
    "_id" : ObjectId("5657412ddb70397479575d1d"),"price" : 200
},
{ 
    "_id" : ObjectId("5657412ddb70397479575d1d"),"price" : 2000
},
{ 
    "_id" : ObjectId("5657412ddb70397479575d1d"),"price" : 2020
},
{ 
    "_id" : ObjectId("5657412ddb70397479575d1d"),"price" : 100
},
{ 
    "_id" : ObjectId("5657412ddb70397479575d1d"),"price" : 3500
},
{ 
    "_id" : ObjectId("5657412ddb70397479575d1d"),"price" : 3900
}

从上面我必须创建价格范围作为平均产品价格,如使用Mongo聚合的flipkart或myntra中可用的过滤器...

[
        {
            range : '100-200',
            count : 2
        },
        {
            range : '1200-2020',
            count : 3
        },
        {
            range : '3500-3900',
            count : 2
        }

]

1 个答案:

答案 0 :(得分:0)

aggregation framework 管道中,您可以利用$cond阶段中的$project运算符创建一个额外字段,表示价格范围落入,然后使用 $group 步骤获取计数:

var pipeline = [    
    {
        "$project": {
            "price": 1,
            "range": {
                "$cond": [ 
                    {
                        "$and": [
                            { "$gte": ["$price", 100] },
                            { "$lte": ["$price", 200] }
                        ]
                    }, 
                    "100-200", 
                    {
                        "$cond": [ 
                            {
                                "$and": [
                                    { "$gte": ["$price", 1200] },
                                    { "$lte": ["$price", 2020] }
                                ]
                            }, 
                            "1200-2020", "2021-above" 
                        ]
                    }
                ]
            }
        }
    },
    { 
        "$group": { 
            "_id": "$range",             
            "count": { "$sum": 1 }
        }  
    },
    {
        "$project": {
            "_id": 0,             
            "range": "$_id",
            "count": 1

        }
    }
];

collection.aggregate(pipeline, function (err, result){
     if (err) {/* Handle err */};
     console.log(JSON.stringify(result, null, 4));
});