‘updateMany’ is used to update all the documents that matches to the given filter, whereas ‘update’ method can modify specific fields of an existing document or documents or replace an existing document entirely, depending on the update parameter. Let’s see it with an example.
> db.audit.find().pretty() { "_id" : ObjectId("60bb0156baf44d88348459c4"), "type" : "login", "client" : "mobile", "userId" : 123, "createdTimestamp" : 1622868310979 } { "_id" : ObjectId("60bb9c348251689f64fb3ece"), "type" : "logout", "client" : "browser", "userId" : 234, "createdTimestamp" : 1622907956987 } { "_id" : ObjectId("60bb9c418251689f64fb3ecf"), "type" : "login", "client" : "browser", "userId" : 1, "createdTimestamp" : 1622907969953 } { "_id" : ObjectId("60bb9c598251689f64fb3ed0"), "type" : "reset_credentials", "client" : "mobile", "userId" : 31, "createdTimestamp" : 1622907993918 } { "_id" : ObjectId("60bb9c6f8251689f64fb3ed1"), "type" : "login", "client" : "mobile", "userId" : 41, "createdTimestamp" : 1622908015960 } >
Update parameter like $set is mandatory for updateMany method.
For example,
> db.audit.updateMany({"type" : "login"}, {"type" : "signIn", "modifiedTimestamp" : Date.now()}) uncaught exception: Error: the update operation document must contain atomic operators : DBCollection.prototype.updateMany@src/mongo/shell/crud_api.js:655:19 @(shell):1:1
Try using $set parameter like below.
db.audit.updateMany({"type" : "login"}, {$set : {"type" : "signIn", "modifiedTimestamp" : Date.now()}})
> db.audit.updateMany({"type" : "login"}, {$set : {"type" : "signIn", "modifiedTimestamp" : Date.now()}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
>
> db.audit.find().pretty()
{
"_id" : ObjectId("60bb0156baf44d88348459c4"),
"type" : "signIn",
"client" : "mobile",
"userId" : 123,
"createdTimestamp" : 1622868310979,
"modifiedTimestamp" : 1622908523246
}
{
"_id" : ObjectId("60bb9c348251689f64fb3ece"),
"type" : "logout",
"client" : "browser",
"userId" : 234,
"createdTimestamp" : 1622907956987
}
{
"_id" : ObjectId("60bb9c418251689f64fb3ecf"),
"type" : "signIn",
"client" : "browser",
"userId" : 1,
"createdTimestamp" : 1622907969953,
"modifiedTimestamp" : 1622908523246
}
{
"_id" : ObjectId("60bb9c598251689f64fb3ed0"),
"type" : "reset_credentials",
"client" : "mobile",
"userId" : 31,
"createdTimestamp" : 1622907993918
}
{
"_id" : ObjectId("60bb9c6f8251689f64fb3ed1"),
"type" : "signIn",
"client" : "mobile",
"userId" : 41,
"createdTimestamp" : 1622908015960,
"modifiedTimestamp" : 1622908523246
}
If you do not provide update parameter ($set), update method replaces one matched document with the new document.
> db.audit.update({"type" : "signIn"}, {"type" : "login", "modifiedTimestamp" : Date.now()}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > > db.audit.find().pretty() { "_id" : ObjectId("60bb0156baf44d88348459c4"), "type" : "login", "modifiedTimestamp" : 1622908612185 } { "_id" : ObjectId("60bb9c348251689f64fb3ece"), "type" : "logout", "client" : "browser", "userId" : 234, "createdTimestamp" : 1622907956987 } { "_id" : ObjectId("60bb9c418251689f64fb3ecf"), "type" : "signIn", "client" : "browser", "userId" : 1, "createdTimestamp" : 1622907969953, "modifiedTimestamp" : 1622908523246 } { "_id" : ObjectId("60bb9c598251689f64fb3ed0"), "type" : "reset_credentials", "client" : "mobile", "userId" : 31, "createdTimestamp" : 1622907993918 } { "_id" : ObjectId("60bb9c6f8251689f64fb3ed1"), "type" : "signIn", "client" : "mobile", "userId" : 41, "createdTimestamp" : 1622908015960, "modifiedTimestamp" : 1622908523246 }
Let’s execute same update query again.
> db.audit.update({"type" : "signIn"}, {"type" : "login", "modifiedTimestamp" : Date.now()}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > > db.audit.find().pretty() { "_id" : ObjectId("60bb0156baf44d88348459c4"), "type" : "login", "modifiedTimestamp" : 1622908612185 } { "_id" : ObjectId("60bb9c348251689f64fb3ece"), "type" : "logout", "client" : "browser", "userId" : 234, "createdTimestamp" : 1622907956987 } { "_id" : ObjectId("60bb9c418251689f64fb3ecf"), "type" : "login", "modifiedTimestamp" : 1622908670676 } { "_id" : ObjectId("60bb9c598251689f64fb3ed0"), "type" : "reset_credentials", "client" : "mobile", "userId" : 31, "createdTimestamp" : 1622907993918 } { "_id" : ObjectId("60bb9c6f8251689f64fb3ed1"), "type" : "signIn", "client" : "mobile", "userId" : 41, "createdTimestamp" : 1622908015960, "modifiedTimestamp" : 1622908523246 }
If you provide $set update parameter, it updates the documents, instead of replacing.
> db.audit.update({"type" : "signIn"}, {$set : {"type" : "login", "modifiedTimestamp" : Date.now()}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>
> db.audit.find().pretty()
{
"_id" : ObjectId("60bb0156baf44d88348459c4"),
"type" : "login",
"modifiedTimestamp" : 1622908612185
}
{
"_id" : ObjectId("60bb9c348251689f64fb3ece"),
"type" : "logout",
"client" : "browser",
"userId" : 234,
"createdTimestamp" : 1622907956987
}
{
"_id" : ObjectId("60bb9c418251689f64fb3ecf"),
"type" : "login",
"modifiedTimestamp" : 1622908670676
}
{
"_id" : ObjectId("60bb9c598251689f64fb3ed0"),
"type" : "reset_credentials",
"client" : "mobile",
"userId" : 31,
"createdTimestamp" : 1622907993918
}
{
"_id" : ObjectId("60bb9c6f8251689f64fb3ed1"),
"type" : "login",
"client" : "mobile",
"userId" : 41,
"createdTimestamp" : 1622908015960,
"modifiedTimestamp" : 1622908909572
}
Previous Next Home
No comments:
Post a Comment