I use this code to unset field when it becomes empty after $pull operation.
{'id': user_id},
[
{
'$set': {
'badges': {
'$filter': {
'input': '$badges',
'cond': {'$ne': ['$$this', badge_id]}
}
}
}
},
{
'$set': {
'badges': {
'$cond': [
{
'$or': [
{'$eq': ['$badges', []]},
{'$eq': ['$badges', None]}
]
},
'$$REMOVE',
'$badges'
]
}
}
}
]
How to do something like it, but delete document instead of field?
>Solution :
You can add after the first $set the bellow $match without the second $set.
The document that has badges = [] or null or missing(no badges field) will be deleted.
aggregate([
your_first_$set
{"$match":
{"$expr":
{"$not":
[{"$or":
[{"$eq": ["$badges", []]},
{"$eq": ["$badges", null]},
{"$eq": [{"$type": "$badges"}, "missing"]}]}]}}}
])