'Delete objects that met a condition inside an array in mongodb

My collection has array "name" with objects inside. I need to remove only those objects inside array where "name.x" is blank.

"name": [
    {
      "name.x": [
        {
          "_id": "607e7fcca57aa56e2a06b57b",
          "name": "abc",
          "type": "123"
        }
      ],
      "_id": {
        "$oid": "62232cd70ce38c5007de31e6"
      },
  "qty": "1.0",
  "Unit": "pound,lbs"
},
{
  "name.x": [
    {
      "_id": "607e7fcca57aa56e2a06b430",
      "name": "xyz",
      "type": "123"
    }
  ],
  "_id": {
    "$oid": "62232cd70ce38c5007de31e7"
  },
  "qty": "1.0",
  "Unit": "pound,lbs"
},{
  "name.x": []
  ,
  "_id": {
    "$oid": "62232cd70ce38c5007de31e7"
  },
  "qty": "1.0",
  "Unit": "pound,lbs"
}

I tried to get all the ids where name.x is blank using python and used $pull to remove objects base on those ids.But the complete array got deleted.How can I remove the objects that meet the condition.



Solution 1:[1]

Think MongoDB update with aggregation pipeline meets your requirement especially to deal with the field name with ..

$set - Update the name array field by $filter name.x field is not an empty array.

db.collection.update({},
[
  {
    $set: {
      name: {
        $filter: {
          input: "$name",
          cond: {
            $ne: [
              {
                $getField: {
                  field: "name.x",
                  input: "$$this"
                }
              },
              []
            ]
          }
        }
      }
    }
  }
],
{
  multi: true
})

Sample Mongo Playground

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Yong Shun