Updating a Document in the mongo Shell with save()As shown in the previous section, the save() method may be used to save a new document to a collection. We can also use save() to update an existing document in a collection. Continuing with the example database from the last section, lets add new information to the document {name:"mongo"} that already is in the collection. > var mongo = db.things.findOne({name:"mongo"}); > print(tojson(mongo)); {"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo"} > mongo.type = "database"; database > db.things.save(mongo); > db.things.findOne({name:"mongo"}); {"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo" , "type" : "database"} > This was a simple example, adding a string valued element to the existing document. When we called save(), the method saw that the document already had an "_id" field, so it simply performed an update on the document. In the next two sections, we'll show how to embed documents within documents (there are actually two different ways), as well as show how to query for documents based on values of embedded documents. Embedding Documents Directly in DocumentsAs another example of updating an existing document, lets embed a document within an existing document in the collection. We'll keep working with the original {name:"mongo"} document for simplicity. > var mongo = db.things.findOne({name:"mongo"}); > print(tojson(mongo)); {"_id" : "497da93d4ee47b3a675d2d9b" , "name" : "mongo", "type" : "database"} > mongo.data = { a:1, b:2}; {"a" : 1 , "b" : 2} > db.things.save(mongo); > db.things.findOne({name:"mongo"}); {"_id" : "497da93d4ee47b3a675d2d9b" , "name" : "mongo" , "type" : "database", "data" : {"a" : 1 , "b" : 2}} > As you can see, we added new data to the mongo document, adding {a:1, b:2} under the key "data". Note that the value of "data" is a document itself - it is embedded in the parent mongo document. With BSON, you may nest and embed documents to any level. You can also query on embedded document fields, as shown here: > db.things.findOne({ "data.a" : 1});
{"_id" : "497da93d4ee47b3a675d2d9b" , "name" : "mongo" , "data" : {"a" : 1 , "b" : 2}}
> db.things.findOne({ "data.a" : 2});
>
Note that the second findOne() doesn't return anything, because there are no documents that match. Database ReferencesAlternatively, a document can reference other documents which are not embedded via a database reference, which is analogous to a foreign key in a relational database. A database reference (or "DBRef" for short), is a reference implemented according to the Database References. Most drivers support helpers for creating DBRefs. Some also support additional functionality, like dereference helpers and auto-referencing. See specific driver documentation for examples / more information In the previous section we saw that the statement obj_a.x = obj_b; Lets repeat the above example, but create a document and place in a different collection, say otherthings, and embed that as a reference in our favorite "mongo" object under the key "otherdata": // first, save a new doc in the 'otherthings' collection > var other = { s : "other thing", n : 1}; > db.otherthings.save(other); > db.otherthings.find(); {"_id" : "497dbcb36b27d59a708e89a4" , "s" : "other thing" , "n" : 1} // now get our mongo object, and add the 'other' doc as 'otherthings' > var mongo = db.things.findOne(); > print(tojson(mongo)); {"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo" , "type" : "database" , "data" : {"a" : 1 , "b" : 2}} > mongo.otherthings = new DBRef( 'otherthings' , other._id ); {"s" : "other thing" , "n" : 1 , "_id" : "497dbcb36b27d59a708e89a4"} > db.things.save(mongo); > db.things.findOne().otherthings.fetch(); {"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo" , "type" : "database" , "data" : {"a" : 1 , "b" : 2} , "otherthings" : {"_id" : "497dbcb36b27d59a708e89a4" , "s" : "other thing" , "n" : 1}} // now, lets modify our 'other' document, save it again, and see that when the dbshell // gets our mongo object and prints it, if follows the dbref and we have the new value > other.n = 2; 2 > db.otherthings.save(other); > db.otherthings.find(); {"_id" : "497dbcb36b27d59a708e89a4" , "s" : "other thing" , "n" : 2} > db.things.findOne().otherthings.fetch(); {"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo" , "type" : "database" , "data" : {"a" : 1 , "b" : 2} , "otherthings" : {"_id" : "497dbcb36b27d59a708e89a4" , "s" : "other thing" , "n" : 2}} > |

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. blog comments powered by Disqus