I have a MongoDB database where the structure of the data has changed between years. A sample of the data is below:
{ entry_id: 111, entrant_company:"Magic", year:2021, credit_name:"Bob Jones", credit_role:"Designer"}
{ entry_id: 111, entrant_company:"Magic", year:2021, credit_name:"Allan Jeggs", credit_role:"Director"}
{ entry_id: 111, entrant_company:"Magic", year:2021, credit_name:"Sarah Jones", credit_role:"Artist"}
{ entry_id: 348, year:2022, credit_name:"Glitter", credit_role:"Advertising Agency"}
{ entry_id: 348, year:2022, credit_name:"Jim Jones", credit_role:"Designer"}
{ entry_id: 348, year:2022, credit_name:"Allan Yi", credit_role:"Publisher"}
{ entry_id: 555, year:2023, credit_name:"Sparkle", credit_role:"Advertising Agency"}
{ entry_id: 555, year:2023, credit_name:"Josh James", credit_role:"Designer"}
{ entry_id: 555, year:2023, credit_name:"Ellen Dodd", credit_role:"Publisher"}
...
For years above 2021, I’m missing the entrant_company
key, and this information is instead provided where credit_role
is equal to “Advertising Agency”.
Grouping my data by entry_id
, how can I add a key called entrant_company
and have it be set so that it’s equal to credit_name
where credit_role
is “Advertising Agency” and the year
is greater than 2021?
For clarity, my goal is to have the data look like this:
{ entry_id: 111, entrant_company:"Magic", year:2021, credit_name:"Bob Jones", credit_role:"Designer"}
{ entry_id: 111, entrant_company:"Magic", year:2021, credit_name:"Allan Jeggs", credit_role:"Director"}
{ entry_id: 111, entrant_company:"Magic", year:2021, credit_name:"Sarah Jones", credit_role:"Artist"}
{ entry_id: 348, entrant_company:"Glitter", year:2022, credit_name:"Glitter", credit_role:"Advertising Agency"}
{ entry_id: 348, entrant_company:"Glitter", year:2022, credit_name:"Jim Jones", credit_role:"Designer"}
{ entry_id: 348, entrant_company:"Glitter", year:2022, credit_name:"Allan Yi", credit_role:"Publisher"}
{ entry_id: 555, entrant_company:"Sparkle", year:2023, credit_name:"Sparkle", credit_role:"Advertising Agency"}
{ entry_id: 555, entrant_company:"Sparkle", year:2023, credit_name:"Josh James", credit_role:"Designer"}
{ entry_id: 555, entrant_company:"Sparkle", year:2023, credit_name:"Ellen Dodd", credit_role:"Publisher"}
I’m able to update a single entry like this, but I’d like to update the entrant_company
for every given entry_id
:
db.entries.updateMany(
{ year: { $gt: 2021 } },
[{
$set: {
entrant_company: {
$cond: {
if: { $eq: ["$credit_role", "Advertising Agency"] },
then: "$credit_name",
else: "$$REMOVE"
}
}
}
}])