CRUD Operation
Syntax#
- insert(document or array of documents)
- insertOne( ‘document’, { writeConcern: ‘document’ }
)
- insertMany( { [ document 1 , document 2, … ] }, { writeConcern: document, ordered: boolean }
)
- find(query, projection)
- findOne(query, projection)
- update(query, update)
- updateOne( query, update, { upsert: boolean, writeConcern: document }
)
- updateMany( query, update, { upsert: boolean, writeConcern: document }
)
- replaceOne( query, replacement, { upsert: boolean, writeConcern: document }
)
- remove(query, justOne)
- findAndModify(query, sort, update, options[optional])
Remarks#
Updating and Deleting a document should be done carefully. Since operation may affect for multiple documents.
Create
db.people.insert({name: 'Tom', age: 28});
Or
db.people.save({name: 'Tom', age: 28});
The difference with save
is that if the passed document contains an _id
field, if a document already exists with that _id
it will be updated instead of being added as new.
Two new methods to insert documents into a collection, in MongoDB 3.2.x:-
Use insertOne
to insert only one record:-
db.people.insertOne({name: 'Tom', age: 28});
Use insertMany
to insert multiple records:-
db.people.insertMany([{name: 'Tom', age: 28},{name: 'John', age: 25}, {name: 'Kathy', age: 23}])
Note that insert
is highlighted as deprecated in every official language driver since version 3.0. The full distinction being that the shell methods actually lagged behind the other drivers in implementing the method. The same thing applies for all other CRUD methods
Update
Update the entire object:
db.people.update({name: 'Tom'}, {age: 29, name: 'Tom'})
// New in MongoDB 3.2
db.people.updateOne({name: 'Tom'},{age: 29, name: 'Tom'}) //Will replace only first matching document.
db.people.updateMany({name: 'Tom'},{age: 29, name: 'Tom'}) //Will replace all matching documents.
Or just update a single field of a document. In this case age
:
db.people.update({name: 'Tom'}, {$set: {age: 29}})
You can also update multiple documents simultaneously by adding a third parameter. This query will update all documents where the name equals Tom
:
db.people.update({name: 'Tom'}, {$set: {age: 29}}, {multi: true})
// New in MongoDB 3.2
db.people.updateOne({name: 'Tom'},{$set:{age: 30}) //Will update only first matching document.
db.people.updateMany({name: 'Tom'},{$set:{age: 30}}) //Will update all matching documents.
If a new field is coming for update, that field will be added to the document.
db.people.updateMany({name: 'Tom'},{$set:{age: 30, salary:50000}})// Document will have `salary` field as well.
If a document is needed to be replaced,
db.collection.replaceOne({name:'Tom'}, {name:'Lakmal',age:25,address:'Sri Lanka'})
can be used.
Note: Fields you use to identify the object will be saved in the updated document. Field that are not defined in the update section will be removed from the document.
Delete
Deletes all documents matching the query parameter:
// New in MongoDB 3.2
db.people.deleteMany({name: 'Tom'})
// All versions
db.people.remove({name: 'Tom'})
Or just one
// New in MongoDB 3.2
db.people.deleteOne({name: 'Tom'})
// All versions
db.people.remove({name: 'Tom'}, true)
MongoDB’s remove()
method. If you execute this command without any argument or without empty argument it will remove all documents from the collection.
db.people.remove();
or
db.people.remove({});
Read
Query for all the docs in the people
collection that have a name
field with a value of 'Tom'
:
db.people.find({name: 'Tom'})
Or just the first one:
db.people.findOne({name: 'Tom'})
You can also specify which fields to return by passing a field selection parameter. The following will exclude the _id
field and only include the age
field:
db.people.find({name: 'Tom'}, {_id: 0, age: 1})
Note: by default, the _id
field will be returned, even if you don’t ask for it. If you would like not to get the _id
back, you can just follow the previous example and ask for the _id
to be excluded by specifying _id: 0
(or _id: false
).If you want to find sub record like address object contains country, city, etc.
db.people.find({'address.country': 'US'})
& specify field too if required
db.people.find({'address.country': 'US'}, {'name': true, 'address.city': true})Remember that the result has a `.pretty()` method that pretty-prints resulting JSON:
db.people.find().pretty()
More update operators
You can use other operators besides $set
when updating a document.
The $push
operator allows you to push a value into an array, in this case we will add a new nickname to the nicknames
array.
db.people.update({name: 'Tom'}, {$push: {nicknames: 'Tommy'}})
// This adds the string 'Tommy' into the nicknames array in Tom's document.
The $pull
operator is the opposite of $push
, you can pull specific items from arrays.
db.people.update({name: 'Tom'}, {$pull: {nicknames: 'Tommy'}})
// This removes the string 'Tommy' from the nicknames array in Tom's document.
The $pop
operator allows you to remove the first or the last value from an array. Let’s say Tom’s document has a property called siblings that has the value ['Marie', 'Bob', 'Kevin', 'Alex']
.
db.people.update({name: 'Tom'}, {$pop: {siblings: -1}})
// This will remove the first value from the siblings array, which is 'Marie' in this case.
db.people.update({name: 'Tom'}, {$pop: {siblings: 1}})
// This will remove the last value from the siblings array, which is 'Alex' in this case.
“multi” Parameter while updating multiple documents
To update multiple documents in a collection, set the multi option to true.
db.collection.update(
query,
update,
{
upsert: boolean,
multi: boolean,
writeConcern: document
}
)
multi is optional. If set to true, updates multiple documents that meet the query criteria. If set to false, updates one document. The default value is false.
db.mycol.find()
{ “_id” : ObjectId(598354878df45ec5), “title”:“MongoDB Overview”} { “_id” : ObjectId(59835487adf45ec6), “title”:“NoSQL Overview”} { “_id” : ObjectId(59835487adf45ec7), “title”:“Tutorials Point Overview”}
db.mycol.update({‘title’:‘MongoDB Overview’},
{$set:{‘title’:‘New MongoDB Tutorial’}},{multi:true})
Update of embedded documents.
For the following schema:
{name: 'Tom', age: 28, marks: [50, 60, 70]}
Update Tom’s marks to 55 where marks are 50 (Use the positional operator $):
db.people.update({name: "Tom", marks: 50}, {"$set": {"marks.$": 55}})
For the following schema:
{name: 'Tom', age: 28, marks: [{subject: "English", marks: 90},{subject: "Maths", marks: 100}, {subject: "Computes", marks: 20}]}
Update Tom’s English marks to 85 :
db.people.update({name: "Tom", "marks.subject": "English"},{"$set":{"marks.$.marks": 85}})
Explaining above example:
By using {name: “Tom”, “marks.subject”: “English”} you will get the position of the object in the marks array, where subject is English. In “marks.$.marks”, $ is used to update in that position of the marks array
Update Values in an Array
The positional $ operator identifies an element in an array to update without explicitly specifying the position of the element in the array.
Consider a collection students with the following documents:
{ "_id" : 1, "grades" : [ 80, 85, 90 ] }
{ "_id" : 2, "grades" : [ 88, 90, 92 ] }
{ "_id" : 3, "grades" : [ 85, 100, 90 ] }
To update 80 to 82 in the grades array in the first document, use the positional $ operator if you do not know the position of the element in the array:
db.students.update(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)