3

I have a document in collection testcol in MongoDB like this :

{
_id:111,
"xxx":"aaa",
"yyy":"bbb"
}

I want to update the field yyy in the document, if the field is found then update it and if the field is not found then don't do anything.

When I am running my mongo db update command like db.testcol.update({_id:0},{$set:{"zzz":"ccc"}},{upsert: false}). Intentionally I gave the field as "zzz" in the update command so that it shouldn't do anything. But when I run the above update command, it inserted the new field "zzz" in the above document although upsert was given false. I know upsert will not/will insert document and not field , but since I am new to MongoDB I was just giving it a try. Can anyone please let me know how to approach this issue?

JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
Soham
  • 218
  • 2
  • 6
  • 15

2 Answers2

6

You can use the $exists operator in your query to only match the document if the yyy field is present:

db.testcol.update({_id: 111, yyy: {$exists: true}}, {$set: {yyy: 'ccc'}})
JohnnyHK
  • 305,182
  • 66
  • 621
  • 471
0

You are using upsert wrong. Please see mongo's docs here

If upsert is true and no document matches the query criteria, update() inserts a single document. The update creates the new document. If upsert is true and there are documents that match the query criteria, update() performs an update.

Eric
  • 9,870
  • 14
  • 66
  • 102