从.group()更改为聚合

时间:2016-04-19 21:37:59

标签: mongodb mongodb-query aggregation-framework

我在MongoDB中进行此查询。但我希望这个查询使用聚合而不是组。这是我正在使用的查询:

var query_part = {
    "shipdate" : { "$gte" : 19940101, "$lt" : 19950101 },
    "partsupp.supplier.nation.name" : { $regex : '^CANADA'}, 
    "partsupp.part.name" : { $regex : '^forest', $options : 'i' }
};

var red = function(doc, out) {
    out.sum += doc.quantity;
};

var half_total_quantity = db.lineitems.group( {
    key : "sum_quantity",
    cond : query_part,
    initial : { sum : 0 },
    reduce : red
})[0].sum / 2;

我正在尝试更改half_total_quantity计算,如下所示:

db.lineitems.aggregate(
{ $match : {$and : [{"shipdate" : { "$gte" : 19940101, "$lt" : 19950101 }},
                    {"partsupp.supplier.nation.name" : { $regex : '^CANADA'}},
                    {"partsupp.part.name" : { $regex : '^forest', $options : 'i' }}
                    ]}},
{ $group : { 
    sum_quantity : { $sum: "$quantity" }
}}
);

但这不起作用,有人可以帮助我吗? 谢谢。

1 个答案:

答案 0 :(得分:3)

您几乎不需要$and,因为所有 MongoDB查询操作已经是" AND"条件,除非另有明确说明。

同样$group需要_id,这里null表示分组"所有内容":

db.lineitems.aggregate([
    { "$match": { 
        "shipdate" : { "$gte" : 19940101, "$lt" : 19950101 },
        "partsupp.supplier.nation.name" : { "$regex": '^CANADA' },
        "partsupp.part.name" : { "$regex": '^forest', "$options": 'i' }
    }},
    { "$group": { 
        "_id": null,
        "sum_quantity": { "$sum": "$quantity" }
    }}
]);

不要忘记括号[],因为这是一个"列表"管道表达式,毕竟。

并添加" halfTotalQuantity"事情,只是在$divide阶段的$project,如果你必须:

db.lineitems.aggregate([
    { "$match": { 
        "shipdate" : { "$gte" : 19940101, "$lt" : 19950101 },
        "partsupp.supplier.nation.name" : { "$regex": '^CANADA' },
        "partsupp.part.name" : { "$regex": '^forest', "$options": 'i' }
    }},
    { "$group": { 
        "_id": null,
        "sum_quantity": { "$sum": "$quantity" }
    }},
    { "$project": {
        "half_quantity": { "$divide": [ "$sum_quantity", 2 ] } 
    }}
]);