-
Type: Bug
-
Resolution: Fixed
-
Priority: Critical - P2
-
Affects Version/s: 1.38.2
-
Component/s: Explain
-
None
-
Environment:OS: Mac, m2
node.js / npm versions: 18.16.0, 9.5.1 (Not sure this is relevant)
Compass: Version 1.38.2 (1.38.2)
Additional info:
Running against CosmosDB v4.2 rather than real Mongo (sorry).
-
3
-
Needed
-
-
Iteration Juravenator
Problem Statement/Rationale
- 🚨 Compass sometimes runs aggregation pipelines without the user clicking 'run'.
- This puts users at significant risk of running pipelines prematurely, this could easily lead to destroying data unintentionally.
- (I noticed this bug with a dev db, I have not lost data 🤞🏽)
Please be sure to attach relevant logs with any sensitive data redacted.
How to retrieve logs for: Compass; Shell
Steps to Reproduce
- Creating an aggregation pipeline using the 'stages' view
- Add some stages, including a final merge step, back into the original collection
- Take note of what the intermediate preview docs
- Click to switch to the text view
- Click back to the stages view
- Notice that the pipeline has been executed!
- I think execution occurs when first clicking to switch to code view, but it is possible it occurs when switching back.
- I never clicked "Run". There was no confirmation modal.
Expected Results
What do you expect to happen?
Aggregation pipelines are high-risk data transformations. Compass should only run aggregation pipelines after an explicit user action.
Actual Results
What do you observe is happening?
Compass runs aggregation pipelines (including $merge) without the user pressing 'run'.
Additional Notes
I have noticed this for several pipelines across the last 1-2 weeks. This when I started using the code view.
This is one example. Notice that the pipeline filtering docs then altering them so they become excluded from the initial $match. This means that looking at the Compass preview documents it is obvious when the pipeline has been executed because all the previews disappear.
// Pipeline on a collection called "integrations"
```
[
{
$match:
/**
* query: The query in MQL.
*/
{
roles: {
$exists: false,
},
},
},
{
$set:
/**
* field: The field name
* expression: The expression.
*/
{
roles: [
{
tenantId: "*",
role: "member",
},
],
},
},
{
$merge:
/**
* into: The target collection.
* on: Fields to identify.
* let: Defined variables.
* whenMatched: Action for matching docs.
* whenNotMatched: Action for non-matching docs.
*/
{
into: "integrations",
on: "_id",
whenMatched: "merge",
whenNotMatched: "fail",
},
}
]
```