Home > Software engineering >  scala MongoDB update with $cond and $not (not display the same result)
scala MongoDB update with $cond and $not (not display the same result)

Time:07-29

If you can help me, I have an update in mongo with $cond , this update is only done if the field is empty, otherwise it updates the field with another value. Example in mongo db

I want to update the field camp1 if camp1 no exits = values if camp1 exits = value2

db.getCollection('prueba').update(
{"cdAccount": "ES3100810348150001326934"},
[{$set:{camp1 :{"$cond": [{"$not": ["$camp1"]}, "values", "value2"]}}}]);

Result:

{
    "_id" : ObjectId("62dd08c3f9869303b79b323b"),
    "cdAccount" : "ES3100810348150001326934",
    "camp1" : "value2"
}

Now I do the same in scala with this code

    def appendIfNotNull(key: String,value :Object) = {
      var eq2Array = new util.ArrayList[Object]()
      eq2Array.add("$" key)
      val eq2Op = new Document("$not", eq2Array)
      var condList = new util.ArrayList[Object]()
      condList.add(eq2Op)
      condList.add(value.asInstanceOf[AnyRef])
      //condList.add("$" key)
      condList.add("value2")
      val availDoc =
        new Document("$cond",
          new Document("$cond", condList)).toBsonDocument(classOf[BsonDocument],getCodecRegistry).get("$cond")
      println("availDoc : "   availDoc)
      documentGrab.append(key,availDoc)
    }
 

       val finalVar = appendIfNotNull("camp1","values")
        println("finalVar : "   finalVar)


availDoc : {"$cond": [{"$not": ["$camp1"]}, "values", "value2"]}
finalVar : Document{{camp1={"$cond": [{"$not": ["$camp1"]}, "values", "value2"]}}}

 val updateDocument = new Document("$set" , finalVar )
 println("updateDocument : "   updateDocument)

 collectionA.updateMany(Filters.eq("cdAccount", "ES3100810348150001326934"),updateDocument)

The only difference I see is that in mongodb the "[" is added at the beginning of the $set and it does it well

MongoDB
[ {$set:{camp1 :{"$cond": [{"$not": ["$camp1"]}, "values", "value2"]}}} ] --> Ok Update
Scale
  {$set:{camp1 :{"$cond": [{"$not": ["$camp1"]}, "values", "value2"]}}} --> Ok in scala , but I get the result II

I am using mongodb 5.0.9

Now in mongodb I execute the statement made in scala

db.getCollection('prueba').update(
{"cdAccount": "ES3100810348150001326934"},
{$set :{camp1 :{"$cond": [{"$not": ["$camp1"]}, "values", "value2"]}}});

When I run it in scala the same thing happens Result II :

{
    "cdAccount" : "ES3100810348150001326934",
    "camp1" : {
        "$cond" : [ 
            {
                "$not" : [ 
                    "$camp1"
                ]
            }, 
            "values", 
            "value2"
        ]
    }
}

Can someone tell me how to fix it?

Thank you so much

CodePudding user response:

You see the very important difference when priting the queries.

$cond is an aggregation pipeline operator. It is processed only when aggregation pipeline is used to update the data. When a simple (non-pipelined) update is used, the operator has no special meaning and this is exactly what you see in the output.

You indicate "pipeline update" by passing an array instead of simple object as update description in javascript API (and mongo console). In Scala/Java you have to use one of the updateMany overloads that takes update description as List, not Bson. I.e. you need something like

collectionA.updateMany(
  Filters.eq("cdAccount", "ES3100810348150001326934"),
  Collections.singletonList(updateDocument)
)
  • Related