2016-04-19 4 views
1

私はMongoDBでこのクエリを実行しています。しかし、私は集計ではなく、グループではなく、このクエリを使用します。これは私が使用していますクエリです:.group()から集約への変更

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" } 
}} 
); 

しかし、これがない作品は、誰かが私を助けることができますか? ありがとうございます。特に明記しない限り、あなたは$and以降のすべての MongoDBのクエリ操作を必要とすることはほとんどない

答えて

3

は、すでにある「AND」条件。これはパイプライン式の「リスト」であることから

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" } 
    }} 
]); 

ブラケット[]を忘れないように、やっぱ:

また$groupは、「すべて」をグループ化を示すために、ここにnullされるであろう、必要とし_id

そして、あなたがしなければならない場合は、別の$project段階で "halfTotalQuantity" の事、ちょうど$divideを追加するには:

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 ] } 
    }} 
]); 
+0

これは完璧です。どうもありがとうございました。Neil Lunn – duknust

+1

@duknust [回答を受け入れる](http://stackoverflow.com/help/accepted-answer)を忘れないでください。 –

+0

完了Neil Lunn :) – duknust