Mam głębokie tablice zagnieżdżone, próbuję grupować według niektórych zagnieżdżonych elementów tablicy i mam to do pracy. jednak gdy próbuję użyć wyrażenia $ subtract, to się nie powiedzie. wszelkie wskazówki są mile widziane.mongodb framework agregacji zagnieżdżonych macierzy odjąć wyrażenie
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
}
wydaje się, że najgłębsza zagnieżdżonych tablicy: $ scenes.records.timeProfile.timing nie odwija się poprawnie do $ odejmowanie, próbowałem $ projekt zmniejszenia pola w rurociągu i bawił się z różnych kombinacji $ projekt i grupa $ bez powodzenia. również próbował odprężyć się więcej niż jeden raz, bez powodzenia.
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 }
i
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 }
Mam trudno jest zrozumieć, co próbujesz zrobić. Jak wyglądałyby twoje pożądane wyniki? – JohnnyHK
pożądane wyjście jest tablicą liczb [responsetimes, gdzie responsetime = timing.stop - timing.start] oparte na stop-start dla każdego elementu w tablicy taktowania, który pasuje do danego timing.id np. SR-G. wyjście jest tablicą, ponieważ scenes.records jest tablicą – user1447121