2012-12-04 16 views
6

İç içe geçmiş dizilerim var, iç içe geçmiş dizi öğelerine göre gruplamaya çalışıyorum ve bunu çalışmaya başladım. Ancak, $ subtract ifadesini kullanmaya çalıştığımda, başarısız olur. herhangi bir işaretçi takdir etti.mongodb aggregation framework iç içe diziler çıkarma ifadesi

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 
} 

o içteki iç içe dizi gibi görünüyor: $ scenes.records.timeProfile.timing çıkarma $ için doğru açılarak değil, ben boru hattında alanları azaltmak için $ projesini çalıştı ve $ çeşitli kombinasyonları ile etrafında oynanan Proje ve $ grubu başarısız oldu. Ayrıca, başarısız bir şekilde birden fazla kez gevşemeye çalıştı.

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 } 

ve

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 } 
+0

Ben zor anlar Yapmaya çalıştığınız şeyi anlamakta yaşıyorum. İstediğiniz çıktı neye benziyordu? – JohnnyHK

+0

istenilen çıktı, zamanlama dizisinde belirtilen zamanlama uyuşan her elemanın durma başlangıcını temel alan bir sayı dizisidir [responsetimes = timeing.stop - timeing.start]. SR-G. çıktı bir dizi çünkü scenes.records bir dizidir – user1447121

cevap

9

Çift sorunları: Tüm yolu timing

  • $subtract aracılığıyla $unwind her iç içe dizi seviyesi gerekir

    1. $group
    2. , $project kullanılmaz

    bu deneyin:

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

    Çıkışlar:

    [ { _id: 'Greeting_Excited', responseTimes: [ 156 ] } ] 
    
  • +0

    Çalıştı, teşekkürler. – user1447121

    İlgili konular