[MongoDB] $pull and $pullAll for Removing Specific Elements from Array Fields
When you want to delete only specific elements from an Array field of a document in Mongoose, it seems good to use MongoDB’s $pull or $pullAll operators.
Assuming there’s data in an articles collection like this:
> db.articles.find()
{
  "_id": ObjectId("5b6d8b9e7e646a3119136780"),
  "editors": [
    ObjectId("5b6d8b9e7e646a311913677c"),
    ObjectId("5b6d8b9e7e646a311913677d"),
    ObjectId("5b6d8b9e7e646a311913677e"),
    ObjectId("5b6d8b9e7e646a311913677f")
  ]
}
{
  "_id" : ObjectId("5b6d8d417e646a3119136782"),
  "editors" : [
    ObjectId("5b6d8b9e7e646a311913677d"),
    ObjectId("5b6d8d417e646a3119136781")
  ]
}
Using the $pull operator to execute an update query:
var deletedUserId = ObjectId("5b6d8b9e7e646a311913677d")
db.articles.update(
  {},
  {
    $pull : {
      editors : deletedUserId
    }
  },
  {
    multi: true
  }
)
The deletedUserId element was removed from editors.
> db.articles.find()
{
  "_id": ObjectId("5b6d8b9e7e646a3119136780"),
  "editors": [
    ObjectId("5b6d8b9e7e646a311913677c"),
    ObjectId("5b6d8b9e7e646a311913677e"),
    ObjectId("5b6d8b9e7e646a311913677f")
  ]
}
Continuing with using the $pullAll operator to execute an update query:
var deletedUserIds = [
  ObjectId("5b6d8b9e7e646a311913677e"),
  ObjectId("5b6d8b9e7e646a311913677f")
]
db.articles.update(
  {},
  {
    $pullAll: {
      editors: deletedUserIds
    }
  },
  {
    multi: true
  }
)
The deletedUserIds elements were removed from editors.
> db.articles.find()
{
  "_id": ObjectId("5b6d8b9e7e646a3119136780"),
  "editors": [
    ObjectId("5b6d8b9e7e646a311913677c")
  ]
}
{
  "_id": ObjectId("5b6d8d417e646a3119136782"),
  "editors": [
    ObjectId("5b6d8b9e7e646a311913677d"),
    ObjectId("5b6d8d417e646a3119136781")
  ]
}
Use cases for MongoDB’s $pull and $pullAll are when you want to clean up fields where references like articles.editors are stored when physically deleting editors data due to user withdrawal.
That’s all from the Gemba where I want to remove specific elements from MongoDB Array fields.