有可能获得一个月,季度和学期mongodb的查询销售额?

在查询汇总中可以获得月份,季度和半月的销售总额,或者我分别执行每个查询?

不pipe模型,我的问题是,你是否可以在一个单一的查询中获得所有的信息,或者我应该单独做。

如果没有,那么获得这些信息的最好方法是什么?

根据文档字段的具体情况,可以通过汇总框架,使用matchprojectgroup阶段的组合来完成。

例如,我将假定一个带有date字段和amount字段的Sales凭证,该凭证应汇总以获得给定期间的总销售额(每月,每季度和半条件的相应datevariables将需要也可以在之前被定义,例如从包含在服务器GET请求中的查询参数中)

 Sales.aggregate() .match(...include general non-date matches here, eg company, etc.) .project({ 'month': { '$cond': { if: { '$and': [ { $gte: [ 'date', new Date(monthStartDate) ] }, { $lte: [ 'date', new Date(monthEndDate) ] }, ]}, then: 'amount', else: 0 } }, 'quarter': { '$cond': { if: { '$and': [ { $gte: [ 'date', new Date(quarterStartDate) ] }, { $lte: [ 'date', new Date(quarterEndDate) ] }, ]}, then: 'amount', else: 0 } }, 'half': { '$cond': { if: { '$and': [ { $gte: [ 'date', new Date(halfStartDate) ] }, { $lte: [ 'date', new Date(halfEndDate) ] }, ]}, then: 'amount', else: 0 } } }) .group({ _id: '_id', month: { $sum: '$month' }, quarter: { $sum: '$quarter' }, half: { $sum: '$half' } }) .exec(function(err, res) { if (err) { reject(err) } resolve(res) }) 

如果能够解决您手头的问题,您可以使用与map-reduce相比较的首选聚合框架 ,因为它通常是可读性强,速度更快的。

当然,这个stream水线看起来是怎样的取决于你的文档的形状(我还不知道),但是同时计算所有三个数据应该是可能的,用$ match阶段过滤文档和一个$ group阶段,计算。
$group阶段中,您可以使用嵌套$ cond运算符的$ sum运算符有条件地总结月份,季度和半年的值。

假设你有一个销售收集文件

 { "_id": ObjectId("579d91a4e474b2af2f1ddc65"), "date": ISODate("2015-06-29T22:00:00Z"), "quantity": 1, "price": 30 } { "_id": ObjectId("579d9193e474b2af2f1ddc66"), "date": ISODate("2015-07-28T22:00:00Z"), "quantity": 3, "price": 20 } { "_id": ObjectId("579d91a4e474b2af2f1ddc67"), "date": ISODate("2015-08-29T22:00:00Z"), "quantity": 2, "price": 10 } { "_id": ObjectId("579d91a4e474b2af2f1ddc68"), "date": ISODate("2015-09-29T22:00:00Z"), "quantity": 4, "price": 15 } { "_id": ObjectId("579d919ee474b2af2f1ddc69"), "date": ISODate("2015-11-28T22:00:00Z"), "quantity": 2, "price": 20 } 

随着地图,减less解决scheme将是

 var mapFunc = function() { date = this.date; if (new ISODate("2015-06-01T00:00:00Z") <= date && date <= new ISODate("2016-01-01T00:00:00Z")) { var totalPrice = this.quantity * this.price; if (new ISODate("2015-11-01T00:00:00Z") <= date) emit ("lastMonth", totalPrice); if (new ISODate("2015-09-01T00:00:00Z") <= date) emit ("lastQuarter", totalPrice); emit("lastSemester", totalPrice); } } var reduceFunc = function(key, values) { return Array.sum(values); } db.sales.mapReduce(mapFunc, reduceFunc, { out: { inline : 1 } } ); 

结果是

 "results" : [ { "_id" : "lastSemester", "value" : 210 }, { "_id" : "lastMonth", "value" : 40 }, { "_id" : "lastQuarter", "value" : 100 } ] 

虽然,我不(也想)知道如何实现这个特定的集合聚合。

唯一想到的是按月$group

 db.corders.aggregate( { $match: { $and: [ { date: { $gte: new ISODate("2015-06-01T00:00:00Z") } }, { date : { $lte: new ISODate("2016-01-01T00:00:00Z") } } ] } }, { $group: { "_id": { "$month": "$date" }, totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } } } } ); 

这给出了结果

 { "_id" : 11, "totalPrice" : 40 } { "_id" : 9, "totalPrice" : 60 } { "_id" : 8, "totalPrice" : 20 } { "_id" : 7, "totalPrice" : 60 } { "_id" : 6, "totalPrice" : 30 } 

应根据任务在当地进一步加以处理。