Are you struggling with complex MongoDB aggregation queries? Don’t worry, we’re here to help simplify the process for you. In this blog post, we’ll focus on the AddToSet operator with multiple conditions in MongoDB aggregation.
Understanding the Problem
Let’s start by understanding the problem at hand. You have a collection of documents with various fields such as _id, subscriber_id, user_country, and event. Your goal is to group these documents by subscriber_id and create an array of unique events associated with each subscriber. However, the challenge lies in considering multiple conditions for each event.
The Solution
To achieve the desired result, we can leverage the power of MongoDB’s aggregation framework. The AddToSet operator comes to the rescue, as it allows us to add elements to an array while ensuring uniqueness. Let’s dive into the solution step by step:
- Projection Stage: We start by selecting the relevant fields for the aggregation using the
$projectstage. This helps us narrow down the data that will be used in subsequent stages. - First Grouping Stage: Next, we group the documents based on the
subscriber_idfield using the$groupstage. Here, we introduce our multiple conditions by using the$condoperator. For each condition, we check if theeventfield matches a specific value (e.g., “eventA” or “eventB”). If the condition is met, we assign a value of 1; otherwise, we assign 0. - Second Grouping Stage: In this stage, we perform another grouping operation to combine the results from the previous stage. We group the documents by the
_id.subscriber_idfield and use the$pushoperator to create an array of event details. We include the “eventA” and “eventB” fields, which were generated in the first grouping stage. - Final Result: After executing the aggregation pipeline, we obtain the desired output. Each document represents a unique subscriber, with the
event_detailsfield containing an array of events associated with that subscriber.
Writing the Aggregation Query
To summarize the solution, here’s the complete aggregation query:
javascriptCopy codedb.collection.aggregate([
{
$project: {
_id: 1,
user_country: 1,
subscriber_id: 1,
event: 1
}
},
{
$group: {
"_id": {
"subscriber_id": "$subscriber_id",
"eventA": {
$cond: {
"if": {
$eq: [
"$event",
"eventA"
]
},
then: 1,
else: 0
}
},
"eventB": {
$cond: {
"if": {
$eq: [
"$event",
"eventB"
]
},
then: 1,
else: 0
}
}
}
}
},
{
$group: {
"_id": {
"subscriber_id": "$_id.subscriber_id"
},
"event_details": {
$push: {
"eventA": "$_id.eventA",
"eventB": "$_id.eventB"
}
}
}
}
]);
Explaining the Output
After executing the aggregation query, you’ll get a result similar to the following:
code{
"_id": {
"subscriber_id": 4504
},
"event_details": [
{
"eventA": 0,
"eventB": 0
},
{
"eventA": 1,
"eventB": 0
},
{
"eventA": 0,
"eventB": 1
}
]
}
To further refine the output and obtain the desired result, we can apply an additional step.
- Refining the Output: By applying the
$addToSetoperator, we can create a new$groupstage to group the documents bysubscriber_idand add unique events to theevent_detailsarray. This will consolidate the results and remove any duplicate events.
Here’s the refined aggregation query:
codedb.collection.aggregate([
{
$group: {
_id: "$subscriber_id",
event_details: {
$addToSet: "$event"
}
}
}
]);
The output will now be:
jsonCopy code{
"_id": 4504,
"event_details": [
"eventB",
"eventA"
]
}
Conclusion
In this blog post, we explored the AddToSet operator with multiple conditions in MongoDB aggregation. By following the step-by-step solution provided, you can effectively group documents and create an array of unique events based on your specific conditions.
By simplifying complex aggregation queries, you can enhance your MongoDB data analysis capabilities and unlock new possibilities for your application.

