'mongodb set field value using if else during document update
Is there a way in mongodb to use if/else to set a field value during an update. i know that i can use find, to return documents, loop over them, and do if/else check on each and make a new save query for each of the documents.
However, that seems wasteful, if there is a way to update conditionally in one go.
Is it possible to conditionally set a field value, e.g like this
Documents.update(
{some_condition: true},
{$set: {"status":
{$cond:
{if : {"some field": "some condition"}},
{then: "value 1"} ,
{else: "value 2"}
}
}}
)
(I know that $cond is used for aggregation, i used it here as an example of what i have in mind.)
Solution 1:[1]
MongoDB doesn't support the sort of conditional update you're looking for. However, you can still do better than using a find, loop, and save approach.
Move the condition check into the update
query selector and then issue two updates (one for each case), using {multi: true}
to apply the update to all matched docs.
// Start with the "if" update
Documents.update(
{some_condition: true, "some field": "some condition"},
{$set: {"status": "value 1"}},
{multi: true},
function(err, numAffected) {
// Now do the "else" update, using $ne to select the rest of the docs
Documents.update(
{some_condition: true, "some field": {$ne: "some condition"}},
{$set: {"status": "value 2"}},
{multi: true},
function(err, numAffected) {
// All done.
}
)
}
)
Solution 2:[2]
Answer: Yes
It's pretty much possible using the $set stage in the aggregation pipeline
- Use $set to compute the conditional value in each record
- Use $out to update the records in the collection
Example:
db.collectionname.aggregate(
[
{
$set: { //Compute the new value
'ResultField': {
$cond: {
if: {
$lt: ['$ScoreField', 40]
},
then: "Fail",
else: "Pass"
}
}
}
},
{
$out: 'collectionname' //Update the records in collection
}
]
)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | JohnnyHK |
Solution 2 | Alpesh Patil |