MongoDB update with condition

前端 未结 6 677
鱼传尺愫
鱼传尺愫 2020-11-29 10:11

I\'m trying to update some field in my collection depending on a condition.

I want to set field active to true if the condition is tr

相关标签:
6条回答
  • 2020-11-29 10:25

    We can do it using aggregation pipeline. Here i am updating male to female and female to male.

    db.customer.updateMany(
       { },
       [
         { $set: { gender: { $switch: {
                               branches: [
                                   { case: { $eq: [ "$gender", 'male' ] }, then: "female" },
                                   { case: { $eq: [ "$gender", 'female' ] }, then: "male" }
                               ],
                               default: ""
         } } } }
       ]
    )
    
    0 讨论(0)
  • 2020-11-29 10:31

    You can update MongoDB document conditionally using findAndModify() or findOneAndUpdate() if you have MongoDB version 3.2+

    0 讨论(0)
  • 2020-11-29 10:34

    Of course you can.... by running 2 queries

    db.collection.update({condition}, { $set: { state } }, { multi: true });
    db.collection.update({!condition}, { $set: { state } }, { multi: false });
    

    for your example case

    db.consent.update(
      {"_id": ObjectId("5714ce0a4514ef3ef68677fd")},
      { $set: { "active": true } });
    
    db.consent.update(
      {"_id": {$ne: ObjectId("5714ce0a4514ef3ef68677fd")}},
      { $set: { "active": false } },
      { multi: true });
    
    0 讨论(0)
  • 2020-11-29 10:37

    You can't.

    Mongo doesn't support combining fields, conditionals etc. in the update statement.

    0 讨论(0)
  • 2020-11-29 10:44
    db.consent.update(
        {
           //YOUR CONDITIONAL HERE TO APLLAY UPDATE ONLY IF CONDITIONAL HAPPEN, SO THE "active": true WILL BE APPLY. 
        }, 
        {
           $set: {
             "active": true,
             "active2": FALSE,
           }
        }, 
        {
            multi: true,
        }
    )
    
    0 讨论(0)
  • 2020-11-29 10:49

    Starting Mongo 4.2, db.collection.update() can accept an aggregation pipeline, finally allowing the update/creation of a field based on another field:

    // { a: "Hello", b: "World" }
    // { a: "Olleh", b: "Dlrow" }
    db.collection.update(
      {},
      [ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ],
      { multi: true }
    )
    // { a: "Hello", b: "World", active: true  }
    // { a: "Olleh", b: "Dlrow", active: false }
    
    • The first part {} is the match query, filtering which documents to update (in our case all documents).

    • The second part [ { $set: { active: { $eq: [ "$a", "Hello" ] } } } ] is the update aggregation pipeline (note the squared brackets signifying the use of an aggregation pipeline). $set is a new aggregation operator and an alias of $addFields. Then any aggregation operator can be used within the $set stage; in our case a conditional equality check on which depends the value to use for the new active field.

    • Don't forget { multi: true }, otherwise only the first matching document will be updated.

    0 讨论(0)
提交回复
热议问题