我有一個聚合函數,像這樣:
var match = {};
match["products.totalprice"] = {$exists:true};
var project = {};
project["_id"] = 0
project["products.totalprice"] = 1;
project["line"] = "$products.closedate";
ThisCollection.aggregate([
{$match: match},
{$project: project},
{$group: {
_id: "$line",
total: {$sum: {$ifNull: ["$products.totalprice", 0]}}
}}
], function(err, docs){
console.log(docs);
});
我的模式實際上是與產品totalprice,closedate和其他一些領域嵌套陣列的名稱和_id領域:
db.data.save({name:"a",products:{totalprice:1,closedate:1,...}})
db.data.save({name:"b",products:{totalprice:2,closedate:2,...}})
和架構的樣子:
var Products = new Schema({
totalprice: Number,
closedate: Date,
otherRandomFields: ...
})
var ThisCollection = new Schema({
name: String,
products:[Products]
});
docs
我s返回我期望看到的日期對象,但總數始終爲0.
我正在檢查$exists
和$ifNull
,因爲我看到某處存在建議(但似乎現在無法找到)。我也確認products.totalprice
在我的模式中是Number
。
任何事情都會跳出來,因爲不正確?
編輯
實際運行該功能(片)輸出:
0: {_id: ["2014-01-01T05:00:00.000Z"], total: 0}
1: {_id: ["2014-01-31T05:00:00.000Z"], total: 0}
2: {_id: ["2014-02-01T05:00:00.000Z"], total: 0}
是很奇怪,_id
返回一個數組?
更多信息
想這可能已經與$sum
一個問題,所以嘗試了一些其他的方法,如$first
和$push
- 這裏是從$push
輸出:
0: {_id: "2014-01-01T05:00:00.000Z", total: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}
1: {_id: "2014-01-31T05:00:00.000Z", total: [0, 0, 0]}
2: {_id: "2014-02-01T05:00:00.000Z", total: [0, 0, 0, 0, 0, 0, 0]}
如果您可以編輯您的問題以包含一些示例文檔和聚合的預期輸出,那將非常有用。 – chridam
@chridam我添加了一些細節。我有成千上萬的實際文件存儲。我期望將_id作爲'products.closedate'被聚合,'total'應該是來自每個'products.closedate'的'products.totalprice'的總和。 –
@chridam我得到'_id'字段作爲'products.closedate'正如所料,但相應的'total'字段總是返回'0' –