Consider this set of test results:
[{
_id: ObjectId(...),
name: "Test1",
acts: [
{
name: "act1",
tests: [
{name: "test1", result: true},
{name: "test2", result: true}]
}]
},
{
_id: ObjectId(...),
name: "Test2",
acts: [
{
name: "act1",
tests: [
{name: "test1", result: true},
{name: "test2", result: false}]
},
{
name: "act2",
tests: [
{name: "test3", result: true}]
}]
}]
I am trying to use aggregation to create a computed field with the sum of all the test results, I want something like this:
[{
_id: ObjectId(...),
name: "Test1",
result: true,
acts: [
{
name: "act1",
result: true,
tests: [
{name: "test1", result: true},
{name: "test2", result: true}]
}]
},
{
_id: ObjectId(...),
name: "Test2",
result: false,
acts: [
{
name: "act1",
result: false,
tests: [
{name: "test1", result: true},
{name: "test2", result: false}]
},
{
name: "act2",
result: true,
tests: [
{name: "test3", result: true}]
}]
}]
I tried using aggregate and $ unwind, $ project and $ group:
aggregate([
{$unwind: "$acts"},
{$unwind: "$acts.tests"},
{$project: {name: 1, acts: 1, failed: {$cond: {if: {$eq: ["$acts.tests.test", "true" ]}, then: 0, else: 1}}}},
{$group: {_id: "$_id", failedCount: {$sum: "$failed"}, acts: {$push: "$acts.tests"}}}
])
But I cannot get it to reverse the $ unwind operation, I get the resulting data structure to be different from the original. Is it possible for the result to look the same as the original collection, but with new aggregated values?
/ gemigspam