| CARVIEW |
- MongoDB
- Home
- Developer Zone
- Manual
- Updating
Updating
UpdateShell syntax for update(): db.collection.update( criteria, objNew, upsert, multi ) Arguments:
save() in the mongo shellThe save() command in the mongo shell provides a shorthand syntax to perform a single object update with upsert: // x is some JSON style object db.mycollection.save(x); // updates if exists; inserts if new save() does an upsert if x has no _id field and an insert if it does. Thus, normally, you will not need to explicitly request upserts, just use save(). Upsert means "update if present; insert is missing". myColl.update( { name: "Joe" }, { name: "Joe", age: 20 }, true );
Modifier OperationsModifier operations are performance enhancement techniques useful when updating an existing object in certain ways, such as incrementing a number. While a conventional implementation works: var j=myColl.findOne( { name: "Joe" } ); j.n++; myColl.save(j); a modifier update has the advantage of no caller latency for the operation, atomicity , plus very little network data transfer. To perform such an operation, pass special modifier verbs in objNew that start with the dollar sign character ($): db.people.update( { name:"Joe" }, { $inc: { n : 1 } } );
On a modifier operation, all members of objNew must be modifiers, which start with $. $inc{ $inc : { field : value } }
increments field by the number value if field is present in the object, otherwise sets field to the number value. $set{ $set : { field : value } }
sets field to value. All datatypes are supported with $set. $unset{ $unset : { field : 1} }
Deletes a given field. v1.3+ $push{ $push : { field : value } }
appends value to field, if field is an existing array, otherwise sets field to the array [value] if field is not present. If field is present but is not an array, an error condition is raised. $pushAll{ $pushAll : { field : value_array } }
appends each value in value_array to field, if field is an existing array, otherwise sets field to the array value_array if field is not present. If field is present but is not an array, an error condition is raised. $pop{ $pop : { field : 1 } }
removes the last element in an array (ADDED in 1.1) { $pop : { field : -1 } }
removes the first element in an array (ADDED in 1.1) | $pull{ $pull : { field : _value } }
removes all occurrences of value from field, if field is an array. If field is present but is not an array, an error condition is raised. $pullAll{ $pullAll : { field : value_array } }
removes all occurrences of each value in value_array from field, if field is an array. If field is present but is not an array, an error condition is raised. UpsertsYou may use upsert with a modifier operation. In such a case, the modifiers will be applied to the update criteria member and the resulting object will be inserted. The following upsert example may insert the object {name:"Joe",x:1,y:1}. db.people.update( { name:"Joe" }, { $inc: { x:1, y:1 } }, true );
There are some restrictions. A modifier may not reference the _id field, and two modifiers within an update may not reference the same field, for example the following is not allowed: db.people.update( { name:"Joe" }, { $inc: { x: 1 }, $set: { x: 5 } } );
Pushing a Unique ValueTo add a value to an array only if not already present, add $ne : <value> to your query expression: update( {_id:'joe', tags: {"$ne": "baseball"}},
{"$push": { tags : "baseball" } } );
Checking the Outcome of an Update RequestAs described above, a non-upsert update may or may not modify an existing object. An upsert will either modify an existing object or insert a new object. The client may determine if its most recent message on a connection updated an existing object, by subsequently issuing a getlasterror command ( findOne( {getlasterror:1} ) ). If the result of the getlasterror command contains an updatedExisting field, the last message on the connection was an update request. If the updatedExisting field's value is true, that update request caused an existing object to be updated; if updatedExisting is false, no existing object was updated. A Note About PaddingWhen you update an object in MongoDB, the update occurs in-place if the object has not grown in size. This is good for insert performance if the collection has many indexes. Mongo also adaptively learns if objects in a collection tend to grow, and if they do, it adds some padding to prevent excessive movements. See Also |
|
- Added by Kristina Chodorow, last edited by Dwight Merriman on Jan 03, 2010 (view change)
- Powered by Atlassian Confluence 3.0.0_01, the Enterprise Wiki.
- Printed by Atlassian Confluence 3.0.0_01, the Enterprise Wiki.
- Bug/feature request –
- Atlassian news –
- Contact administrators

Comments (16)
IF YOU HAVE A QUESTION, POST IT TO THE USER GROUP.
These pages are fine for comments, but for questions, your best bet will always be the MongoDB User Group.Aug 17
Anonymous says:
test showing usage of push, pushAll, pull, and pullAll using mongo-ruby-driver ...test showing usage of push, pushAll, pull, and pullAll using mongo-ruby-driver
https://gist.github.com/169258
Nov 12
Anonymous says:
How do I remove a single item? For instance if I have the object {foo: {ba...How do I remove a single item? For instance if I have the object
{foo: {bar: {baz: 'hello}}}and I wanted to remove bar (including it's embedded document). It would be nice to have a way to do this in an update statement.
Nov 12
Kristina Chodorow says:
You can't, yet, but $unset is coming in 1.1.4 (see https://jira.mongodb.org/brows...You can't, yet, but $unset is coming in 1.1.4 (see https://jira.mongodb.org/browse/SERVER-134)
Nov 18
Anonymous says:
Is there a way to support uniquness (or order) on list elements. I.e. when using...Is there a way to support uniquness (or order) on list elements.
I.e. when using $push, you can add duplicate elements like:
> db.c.findOne() {"_id" : ObjectId( "4b040ab17b5a103277c14568") , "arr" : [] , "name" : "a"} > db.c.update({name:'a'}, {$push: {arr: 1}}) > db.c.findOne() {"_id" : ObjectId( "4b040ab17b5a103277c14568") , "name" : "a" , "arr" : [1]} > db.c.update({name:'a'}, {$push: {arr: 1}}) > db.c.findOne() {"_id" : ObjectId( "4b040ab17b5a103277c14568") , "name" : "a" , "arr" : [1,1]}... but what if I need to maintain a set of unique elements?
For example, let's say I want to keep a list of all books owned by a person:
{"_id": ObjectId("..."), "name": "John", "books": set(["The Adventures of Tom Sawyer", "Javascript Bible"])}I'd like a way to add a book to the set and check for existence. Is this possible with MongoDB?
Nov 20
Kristina Chodorow says:
See https://jira.mongodb.org/browse/SERVER-176.See https://jira.mongodb.org/browse/SERVER-176.
Dec 05
Anonymous says:
see "$push a Unique Value" above. Gregg Lind, happy mongo usersee "$push a Unique Value" above.
Gregg Lind, happy mongo user
Nov 27
Anonymous says:
Is it possible to use $pull to remove an object in an array? For example if ther...Is it possible to use $pull to remove an object in an array? For example if there was an object like:
{_id:1, props: [ {name:"n1",val:"v1"}, {name:"n2", val:"v2} ]}is there a way to pull from the props array?
Dec 05
Anonymous says:
It took my some time before I understood that update only updates the first reco...It took my some time before I understood that update only updates the first record it finds.
I tried stuff like:
db.mynames.update({_id:{$gte:0}},{$inc:{age:}});
I just assumed that it would update all records.
Dec 14
Dwight Merriman says:
multi update is now an optionmulti update is now an option
Dec 05
Anonymous says:
I mean db.mynames.update({_id : {$gte:0}},{$inc:{age:1}});I mean
db.mynames.update({_id : {$gte:0}},{$inc:{age:1}});
Dec 21
Anonymous says:
Let's say I have the following object: {_id:1, elements: [ {name:n1,val:v1}, {n...Let's say I have the following object:
{_id:1, elements: [ {name:n1,val:v1}, {name:n2,val:v2} ]}I want to remove items under "elements" whose name matches a specified value. Can this be done with $pull?
For example, I want to remove items whose name = n1 such that after removing, the object above become:
{_id:1, elements: [ {name:n2,val:v2} ]}Is this possible?
Dec 22
Eliot Horowitz says:
in 1.3.x it is: db.foo.update ( {} , { $pull : [ { name : n1 } ] } , false , tr...in 1.3.x it is:
db.foo.update
( {} , { $pull : [ { name : n1 } ] } , false , true )Jan 05
Anonymous says:
Try this: (I use 1.3 dont know if 1.2 works) db.x.y.update( {_id:1}, { $pull:...Try this: (I use 1.3 dont know if 1.2 works)
db.x.y.update( {_id:1}, { $pull:{elements:{name:n1} } } )Jan 06
Anonymous says:
Let's say I have this: {_id:1, foo: { anotherfoo: 100 } } I want to increment ...Let's say I have this:
{_id:1, foo: { anotherfoo: 100 } }
I want to increment the field anotherfoo using $inc
I'm doing this in Java but this code does not work
coll.update(new BasicDBObject("_id", new ObjectId(id)), new BasicDBObject("$inc", new BasicDBObject("foo",new BasicDBObject("anotherfoo", 100)));
is there a way to do this?
thanks!
Dec 31
Anonymous says:
sorry: i reply in the correct way Let's say I have this: {_id:1, foo: {anoth...sorry: i reply in the correct way
Let's say I have this:
{_id:1, foo: {anotherfoo: 100} }I want to increment the field anotherfoo using $inc
I'm doing this in Java but this code does not work
is there a way to do this?
thanks!
Dec 31
Anonymous says:
answering to myself, ftw coll.update(new BasicDBObject("_id", id)), new Bas...answering to myself, ftw
Add Comment