How to remove a field completely from a MongoDB document?

MongodbMongodb QueryDatabase

Mongodb Problem Overview


{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

Suppose this is a document. How do I remove "words" completely from all the documents in this collection? I want all documents to be without "words":

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}

Mongodb Solutions


Solution 1 - Mongodb

Try this: If your collection was 'example'

db.example.update({}, {$unset: {words:1}}, false, true);

Refer this:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

UPDATE:

The above link no longer covers '$unset'ing. Be sure to add {multi: true} if you want to remove this field from all of the documents in the collection; otherwise, it will only remove it from the first document it finds that matches. See this for updated documentation:

<https://docs.mongodb.com/manual/reference/operator/update/unset/>

Example:

db.example.update({}, {$unset: {words:1}} , {multi: true});

Solution 2 - Mongodb

In the beginning, I did not get why the question has a bounty (I thought that the question has a nice answer and there is nothing to add), but then I noticed that the answer which was accepted and upvoted 15 times was actually wrong!

Yes, you have to use $unset operator, but this unset is going to remove the words key which does not exist for a document for a collection. So basically it will do nothing.

So you need to tell Mongo to look in the document tags and then in the words using dot notation. So the correct query is.

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

Just for the sake of completion, I will refer to another way of doing it, which is much worse, but this way you can change the field with any custom code (even based on another field from this document).

Solution 3 - Mongodb

db.example.updateMany({},{"$unset":{"tags.words":1}})

We can also use this to update multiple documents.

Solution 4 - Mongodb

To remove or delete field in MongoDB

  • For single Record

     db.getCollection('userData').update({}, {$unset: {pi: 1}})
    
  • For Multi Record

      db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
    

Solution 5 - Mongodb

Starting in Mongo 4.2, it's also possible to use a slightly different syntax:

// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.updateMany({}, [{ $unset: ["tags.words"] }])
// { name: "book", tags: { lat: 33, long: 22 } }

Since the update method can accept an aggregation pipeline (note the squared brackets signifying the use of an aggregation pipeline), it means the $unset operator used here is the aggregation one (as opposed to the "query" one), whose syntax takes an array of fields.

Solution 6 - Mongodb

db.collection.updateMany({}, {$unset: {"fieldName": ""}})

updateMany requires a matching condition for each document, since we are passing {} it is always true. And the second argument uses $unset operator to remove the required field in each document.

Solution 7 - Mongodb

The solution for PyMongo (Python mongo):

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);

Solution 8 - Mongodb

I was trying to do something similar to this but instead remove the column from an embedded document. It took me a while to find a solution and this was the first post I came across so I thought I would post this here for anyone else trying to do the same.

So lets say instead your data looks like this:

{ 
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}

To remove the column words from the embedded document, do this:

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

or using the updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

The $unset will only edit it if the value exists but it will not do a safe navigation (it wont check if tags exists first) so the exists is needed on the embedded document.

This uses the all positional operator ($[]) which was introduced in version 3.6

Solution 9 - Mongodb

Because I kept finding this page when looking for a way to remove a field using MongoEngine, I guess it might be helpful to post the MongoEngine way here too:

Example.objects.all().update(unset__tags__words=1)

Solution 10 - Mongodb

In mongoDB shell this code might be helpful:

db.collection.update({}, {$unset: {fieldname: ""}} )

Solution 11 - Mongodb

By default, the update() method updates a single document. Set the Multi Parameter to update all documents that match the query criteria.

Changed in version 3.6. Syntax :

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

Example :

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

In your example :

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})

Solution 12 - Mongodb

And for mongomapper,

  • Document: Shutoff
  • Field to remove: shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )

Solution 13 - Mongodb

{ name: 'book', tags: { words: ['abc','123'], lat: 33, long: 22 } }

Ans:

db.tablename.remove({'tags.words':['abc','123']})

Solution 14 - Mongodb

Checking if "words" exists and then removing from the document

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

true indicates update multiple documents if matched.

Solution 15 - Mongodb

you can also do this in aggregation by using project at 3.4

{$project: {"tags.words": 0} }

Solution 16 - Mongodb

To reference a package and remove various "keys", try this

db['name1.name2.name3.Properties'].remove([{     "key" : "name_key1"},{     "key" : "name_key2"},{     "key" : "name_key3"})]

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTIMEXView Question on Stackoverflow
Solution 1 - MongodbShaunakView Answer on Stackoverflow
Solution 2 - MongodbSalvador DaliView Answer on Stackoverflow
Solution 3 - MongodbVipul PandeyView Answer on Stackoverflow
Solution 4 - MongodbViral PatelView Answer on Stackoverflow
Solution 5 - MongodbXavier GuihotView Answer on Stackoverflow
Solution 6 - MongodbJatin SaradgikarView Answer on Stackoverflow
Solution 7 - MongodbYakir TsuberiView Answer on Stackoverflow
Solution 8 - MongodbJonathon GardnerView Answer on Stackoverflow
Solution 9 - MongodbLaundroMatView Answer on Stackoverflow
Solution 10 - MongodbVinceView Answer on Stackoverflow
Solution 11 - MongodbAmitesh BhartiView Answer on Stackoverflow
Solution 12 - MongodbJon KernView Answer on Stackoverflow
Solution 13 - MongodbPoonam AgrawalView Answer on Stackoverflow
Solution 14 - MongodbAbhiView Answer on Stackoverflow
Solution 15 - Mongodbjoel RajaView Answer on Stackoverflow
Solution 16 - MongodbaspadacioView Answer on Stackoverflow