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?
CodePudding user response:
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"]}]}]}}}
])