I'm trying to remove several hundred thousand array objects spread out over thousands of documents that were migrated in error but can't quite get my query to work. I need to remove the entire array object if a single field within that object matches. Here's sample data:
{
"_id": {
"$oid": "5f11d4c28663f32e940696e0"
},
"Widgets": [{
"WidgetId": 1,
"Name": "Basic Widget",
"YearLaunched": 2011,
"InitialProduction": 50000,
"WidgetIdLegacy": "leg-0120"
}, {
"WidgetId": 2,
"Name": "Advanced Widget",
"YearLaunched": 2013,
"InitialProduction": 35000,
"WidgetIdLegacy": "leg-0150"
}, {
"WidgetId": 3,
"Name": "Prototype Widget",
"YearLaunched": 2009,
"InitialProduction": 100,
"WidgetIdLegacy": "ptp-0004"
}],
"Manufacturer": "WidgetCo",
"Status": 3,
}
{
"_id": {
"$oid": "5f11d4c28663f32e940696e1"
},
"Widgets": [{
"WidgetId": 10,
"Name": "Widget 2.0",
"YearLaunched": 2017,
"InitialProduction": 150000,
"WidgetIdLegacy": "leg-5099"
}, {
"WidgetId": 20,
"Name": "Advanced Widget 2.0",
"YearLaunched": 2018,
"InitialProduction": 10000,
"WidgetIdLegacy": "leg-5199"
}, {
"WidgetId": 3,
"Name": "Prototype Widget",
"YearLaunched": 2009,
"InitialProduction": 100,
"WidgetIdLegacy": "ptp-0004"
}],
"Manufacturer": "Acme Widgets",
"Status": 3,
}
I want to remove the entire object from the Widgets array where the Widgets.WidgetIdLegacy: "ptp-0004".
Through reading other similar questions I write the following query which seems to find the objects but doesn't pull them so I know I'm missing something simple and fundamental
db.getCollection("sandbox.sample").update({},{$pull: {"WidgetIdLegacy": "ptp-0004"}},{multi:true});
The final data should look like:
{
"_id": {
"$oid": "5f11d4c28663f32e940696e0"
},
"Widgets": [{
"WidgetId": 1,
"Name": "Basic Widget",
"YearLaunched": 2011,
"InitialProduction": 50000,
"WidgetIdLegacy": "leg-0120"
}, {
"WidgetId": 2,
"Name": "Advanced Widget",
"YearLaunched": 2013,
"InitialProduction": 35000,
"WidgetIdLegacy": "leg-0150"
}],
"Manufacturer": "WidgetCo",
"Status": 3,
}
{
"_id": {
"$oid": "5f11d4c28663f32e940696e0"
},
"Widgets": [{
"WidgetId": 10,
"Name": "Widget 2.0",
"YearLaunched": 2017,
"InitialProduction": 150000,
"WidgetIdLegacy": "leg-5099"
}, {
"WidgetId": 20,
"Name": "Advanced Widget 2.0",
"YearLaunched": 2018,
"InitialProduction": 10000,
"WidgetIdLegacy": "leg-5199"
}],
"Manufacturer": "Acme Widgets",
"Status": 3,
}
Thanks for any help!
$pullAllwill not work for this try thisdb.getCollection("sandbox.sample").update({},{$pull: {"Widgets": {"WidgetIdLegacy": "ptp-0004"}}},{multi:true});