-
-
Save cthurston/7aead8229e10caa0be175babf7e8ddf1 to your computer and use it in GitHub Desktop.
db.getCollection('list').aggregate([ | |
{ | |
$facet: { | |
"events":[{ | |
$match: { | |
'type': 'Event' | |
} | |
}], | |
"tasks": [{ | |
$match: { | |
'type': 'Task' | |
} | |
}] | |
} | |
}, | |
{$project: {activity:{$setUnion:['$events','$tasks']}}}, | |
{$unwind: '$activity'}, | |
{$replaceRoot: { newRoot: "$activity" }} | |
]); |
I would like to give my 2 cents that this example of query is not the best one. Most often you'll use $setUnion
to combine data of similar nature (in this case: from the same collection). But there are also many cases when different data combining will create you some problems as it will be now stored in one single array.
As for the query: there's no need to develop such a complicated query. This one will give you the same result:
db.getCollection('list').aggregate([{
$match: {
$or: [{
type: 'Event'
}, {
type: 'Task'
}]
}
}]);
or even
db.getCollection('list').aggregate([{
$match: {
type: {$in: ['Event', 'Task']}
}
}]);
And yes, I understand that's just an example of using $facet + $setUnion
.
The scenario is not contrived. Salesforce has an activity type from which they extend to create events and tasks. However, often times you want to display all activity on a particular record, sorted correctly by some criteria. If you don't do it in the query using facet and setUnion you end up having to do extra logic on your server or in your client.
This was very useful, thank you 🥇 💯
Thanks for this one !
This was very useful, thank you!
How would you apply skip and limit on the combined results?
How would you apply skip and limit on the combined results?
The scenario is not contrived. Salesforce has an activity type from which they extend to create events and tasks. However, often times you want to display all activity on a particular record, sorted correctly by some criteria. If you don't do it in the query using facet and setUnion you end up having to do extra logic on your server or in your client.
The documentation states that $setUnion
removes duplicates. How does that affect the final output if the output from both $facet stages contains fields with identical names?
Thank you!