7

私は深いネストされた配列を持っています、私はいくつかのネストされた配列要素によってグループ化しようとしています、そしてこれを機能させました。ただし、$ subtract式を使用しようとすると、失敗します。どんなポインタでもありがたいです。

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が$subtractに対して正しく巻き戻されていないようです。パイプラインのフィールドを減らすために、$ projectを試し、$projectと$groupのさまざまな組み合わせを試してみましたが失敗しました。また、何度も巻き戻そうとしましたが、失敗しました。

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 }
4

1 に答える 1

10

カップルの問題:

  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 ] } ]
于 2012-12-05T03:32:40.447 に答える