MongoDB Update Statement
While discussing the pros and cons of MongoDB, my students wanted to know how to update a specific element in a collection. Collections are like tables in relational databases.
You create the users collection by inserting rows like this:
db.users.insert(
[
{ contact_account: "CA_20170321_0001"
, first_name: "Jonathan"
, middle_name: "Eoin"
, last_name: "MacGregor"
, addresses:
{
street_address: ["1111 Broadway","Suite 101"]
, city: "Oakland"
, state: "CA"
, zip: "94607"
}
}
, { contact_account: "CA_20170328_0001"
, first_name: "Remington"
, middle_name: "Alain"
, last_name: "Dennison"
, addresses:
{
street_address: ["2222 Broadway","Suite 121"]
, city: "Oakland"
, state: "CA"
, zip: "94607"
}
}
]) |
You can query the results with the db.users.find({}) command, or you can query the formatted results with the following command:
db.users.find({}).pretty() |
You can provide a simple update of middle_name element of a given collection element with the findAndModify() function. The following queries the users collection to find the JSON middle_name element where the contact_account value is equal to the “CA_20170330_0001” string.
db.users.findAndModify(
{ query: { contact_account: "CA_20170328_0001" }
, update: { $set: { middle_name: "Alan" }}
, upsert: false }) |
After changing the middle_name value from “Alain” to “Alan”, you can query the single element of the collection with the following:
db.users.find({ contact_account: "CA_20170328_0001" }).pretty() |
It should return the following:
{
"_id" : ObjectId("5bd7f69ba135dda917665de7"),
"contact_account" : "CA_20170328_0001",
"first_name" : "Remington",
"middle_name" : "Alan",
"last_name" : "Dennison",
"addresses" : {
"street_address" : [
"2222 Broadway",
"Suite 121"
],
"city" : "Oakland",
"state" : "CA",
"zip" : "94607"
}
} |
You can replace the addresses string element value a collection of elements with the following findAndModify() function:
db.users.findAndModify(
{ query: { contact_account: "CA_20170328_0001" }
, update:
{ $set:
{ addresses:
[
{
active_status: true
, start_date : new Date("2018-10-30")
, street_address: ["2222 Broadway","Suite 121"]
, city: "Oakland"
, state: "CA"
, zip: "94607"
}
, {
active_status: false
, start_date: new Date("2017-10-01")
, end_date : new Date("2018-10-29")
, street_address: ["2222 Broadway","Suite 121"]
, city: "Oakland"
, state: "CA"
, zip: "94607"
}
]
}
}
, upsert: false }) |
You can re-query the modified result set with find() function with the same query syntax as used previously. This looks for a specific member element in the collection by matching the contact_account name’s value pair. It is the same as the one used earlier in this blog post.
db.users.find({ contact_account: "CA_20170328_0001" }).pretty() |
It should return the following:
{
"_id" : ObjectId("5bd7f69ba135dda917665de7"),
"contact_account" : "CA_20170328_0001",
"first_name" : "Remington",
"middle_name" : "Alan",
"last_name" : "Dennison",
"addresses" : [
{
"active_status" : true,
"start_date" : ISODate("2018-10-30T00:00:00Z"),
"street_address" : [
"2222 Broadway",
"Suite 121"
],
"city" : "Oakland",
"state" : "CA",
"zip" : "94607"
},
{
"active_status" : false,
"start_date" : ISODate("2017-10-01T00:00:00Z"),
"end_date" : ISODate("2018-10-29T00:00:00Z"),
"street_address" : [
"2222 Broadway",
"Suite 121"
],
"city" : "Oakland",
"state" : "CA",
"zip" : "94607"
}
]
} |
As always, I hope this helps someone.