131

Doc:

{
   _id: 5150a1199fac0e6910000002,
   name: 'some name',
   items: [{
      id: 23,
      name: 'item name 23'
   },{
      id: 24,
      name: 'item name 24'
   }]
}

Is there a way to pull a specific object from an array? I.E. how do I pull the entire item object with id 23 from the items array.

I have tried:

db.mycollection.update({'_id': ObjectId("5150a1199fac0e6910000002")}, {$pull: {id: 23}});

However I am pretty sure that I am not using 'pull' correctly. From what I understand pull will pull a field from an array but not an object.

Any ideas how to pull the entire object out of the array.

As a bonus I am trying to do this in mongoose/nodejs, as well not sure if this type of thing is in the mongoose API but I could not find it.

1

8 Answers 8

216

try..

db.mycollection.update(
    { '_id': ObjectId("5150a1199fac0e6910000002") }, 
    { $pull: { items: { id: 23 } } },
    false, // Upsert
    true, // Multi
);
Sign up to request clarification or add additional context in comments.

3 Comments

yup, my syntax was wrong. Thanks! Also tried without the upset and multi options and that worked as well.
What are those boolean values?
@NicolasDelValle if I remember correctly, these were options upsert and multi. For current syntax & documentation check this link: docs.mongodb.com/manual/reference/method/db.collection.update
13

I have a document like

enter image description here

I have to delete address from address array

After searching lots on internet I found the solution

Customer.findOneAndUpdate(query, { $pull: {address: addressId} }, (err, data) => {
    if (err) {
        return res.status(500).json({ error: 'error in deleting address' });
    }

    res.json(data);
});

2 Comments

How to do this in MongoDB CLI ?
I think this is nodejs (express) solution not the MongoDB query solution
8

my database:

{
  "_id" : ObjectId("5806056dce046557874d3ab18"),
  "data" : [ 
    { "id" : 1 }, 
    { "id" : 2 }, 
    { "id" : 3 }
  ]
}
    

my query:

db.getCollection('play_table').update({},{$pull:{"data":{"id":3}}},{multi:true}

output:

{
  "_id" : ObjectId("5806056dce046557874d3ab18"),
  "data" : [ 
    { "id" : 1 }, 
    { "id" : 2 }
  ]
}

Comments

6

You can try it also:

db.getCollection('docs').update({ },{'$pull':{ 'items':{'id': 3 }}},{multi:true})

Comments

6

For a single record in array:

db.getCollection('documents').update(
    { },
    {'$pull':{ 'items':{'mobile': 1234567890 }}},
    {new:true}
);

For a multiple records with same mobile number in array:

db.getCollection('documents').update(
    { },
    {
        $pull: {
            items: { mobile: 1234567890 }
        }
    },
    { new:true, multi:true }
)

Comments

1

Use $pull to remove the data

return this.mobiledashboardModel
.update({"_id": args.dashboardId}, { $pull: {"viewData": { "_id": widgetId}}})
.exec()
.then(dashboardDoc => {
     return {
        result: dashboardDoc
     }
});

Comments

0

Kishore Diyyana:

If you want to remove all elements including the key of the element attributes list.

Here is the example of mongoDB unset operator:

db.UM_PREAUTH_CASE.update(
{ 'Id' : 123}, { $unset: { dataElements: ""} } )

JSON Look like this:

{ "Id":123,"dataElements" : [ { "createdBy" : "Kishore Babu Diyyana", "createdByUserId" : 2020 }, { "createdBy" : "Diyyana Kishore", "createdByUserId" : 2021 } ] }

Comments

0
Very simple way to do this:-

Sample data that I used is:-
{
            "_id": "6419606109433f61b50dfaa4",
            "category": "SUV",
            "vehicles": [
                {
                    "id": "18d527aa-948e-40bc-9ce1-c54dc04a6350"
                    "name": "Honda City 4th Generation",
                    "average": "23.26 kmpl",
                    "cc": "1197 cc",
                    "seat": "5 Seater",
                },
{
                    "id": "18d527aa-948e-40bc-9ce1-c54dc04a6349"
                    "name": "Honda City 4th Generation",
                    "average": "23.26 kmpl",
                    "cc": "1197 cc",
                    "seat": "5 Seater",
                },
}

exports.delete_vehicle = async (req, res, next) => {
  const { id, vuuid } = req.params;
  const vehicle = await VehicleCategory.find({ _id: id });
  try{
    for(let i = 0; i < vehicle[0].vehicles.length; i++){
      if(vehicle[0].vehicles[i].id === vuuid){
        await VehicleCategory.findByIdAndUpdate(
          {_id:id},
          { $pull: { vehicles: { id: vuuid } } },
          { new: true }
        );
        res.status(200).json({
          message: "Vehicle deleted successfully."
        });
      }else{
        res.status(404).json({
          message: "The given id is not found."
        });
      }
    }
  }catch (err) {
    res.status(500).json({
      error: err
    });
  }
  

};

router.put("/deleteVehicle/:id/:vuuid", userController.delete_vehicle);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.