mongodb聚合框架嵌套数组减去expression式

我有深嵌套数组,我试图通过一些嵌套数组元素,并得到这个工作。 但是,当我尝试使用$减法expression式,它失败。 任何指针赞赏。

Data: -scenes: [ -{ name: "Greeting_Excited" -records: [ - { type: "listeningCycle" listeningId: 2 timestamp: 1354566662041 -events: [ … ] -timeProfile: { -timeStampInfo: { earliestStamp: 1354566664530 latestStamp: 1354566678412 } -timing: [ -{ start: 400 stop: 556 id: "SR-G" } -{ start: 559 stop: 572 id: "NL-G" } ] } } ] } ] collection..aggregate( {$unwind:"$scenes"}, {$match: {'scenes.records.timeProfile.timing.id' : 'SR-G'}}, {$group: { _id : {segmentname: "$scenes.name"} , responsetimes : { $push : {$subtract : ["$scenes.records.timeProfile.timing.stop", "$scenes.records.timeProfile.timing.start"]} }}}, {$sort:{responsetimes:1}} I am using the mongodb 2.2.1 and native node mongodb driver 1.1.11. what i am trying to do: -group by scenes [unwind the scenes array], -for a match with SR-G timing-id, -gather all the response times, hence the $subtract (stop-start). This is the error msg i see: { "errmsg" : "exception: can't convert from BSON type Array to long", "code" : 16004, "ok" : 0 } 

它似乎是最内层的嵌套数组:$ scenes.records.timeProfile.timing没有正确解绕$减,我试图$项目,以减less在pipe道中的字段,并与$项目和$组的各种组合玩弄失败。 也试图放松不止一次,失败。

 collection.aggregate( {$project: {segmentname:"$scenes.name", timingid: "$scenes.records.timeProfile.timing.id", timingstart:"$scenes.records.timeProfile.timing.start", timingstop:"$scenes.records.timeProfile.timing.stop"}}, {$unwind:"$scenes"}, {$match: {'scenes.records.timeProfile.timing.id' : 'SR-G'}} ) { "result" : [ ], "ok" : 1 } 

 collection.aggregate( {$unwind: "$scenes"}, {$project: {segmentname:"$scenes.name", timingid: "$scenes.records.timeProfile.timing.id", timingstart:"$scenes.records.timeProfile.timing.start", timingstop:"$scenes.records.timeProfile.timing.stop"}}, {$unwind:"$scenes.records.timeProfile.timing"}, {$match: { "scenes.records.timeProfile.timing.id" : "SR-G"}}, {$project: {segmentname:"$scenes.name", timingid: "$scenes.records.timeProfile.timing.id", timingstart:"$scenes.records.timeProfile.timing.start", timingstop:"$scenes.records.timeProfile.timing.stop"}} ) { "result" : [ ], "ok" : 1 } 

情侣问题:

  1. 您需要$unwind每个嵌套数组级别一直到timing
  2. $subtract用于$project ,而不是$group

尝试这个:

 collection.aggregate([ {$unwind: "$scenes"}, {$unwind: "$scenes.records"}, {$unwind: "$scenes.records.timeProfile.timing"}, {$match: {'scenes.records.timeProfile.timing.id' : 'SR-G'}}, {$project: { segmentname: "$scenes.name", responseTime: {$subtract: ['$scenes.records.timeProfile.timing.stop', '$scenes.records.timeProfile.timing.start'] } }}, {$group: { _id: '$segmentname', responseTimes: {$push: '$responseTime'} }} ], function (err, results) { console.log(results); }); 

输出:

 [ { _id: 'Greeting_Excited', responseTimes: [ 156 ] } ]