$set (aggregation) on Java with mongo-java-driver/4.0/

I need to use the $set operator (aggregation) on Java, please someone can help me

Hello @Hamilton_Smith_Carva, welcome to the forum.

The Updates with Aggregation Pipeline feature is introduced with MongoDB v4.2. The $set is one of the pipeline stages used with this feature. This feature allows using a pipeline with stages and Aggregation Operators in transforming the data to be updated to the document.

I will help you with the usage of $set and with Java. Please do provide what is the collection document and its fields you are trying to update (and also in what way) using the pipeline. Or, is it just you are looking for an example?


Here is an example:

A document in a collection testColl:

{ _id: 1, firstName: "John", lastName: "Doe" }

And, lets update this document with a new field fullName with a value "Doe, John". Note the new field is a concatenation of the two existing fields, firstName and lastName.

The Java code for this update operation with the Aggregation Pipeline uses the updateOne​(Bson filter, List<? extends Bson> update) method of MongoCollection. Note the second parameter is a Bson List which describes the pipeline.

MongoCollection<Document> collection = mongoClient.getDatabase("test")
                                                  .getCollection("testColl");
Bson query = new Document("_id", 1);
List<Bson> update = Arrays.asList(
    Filters.eq("$set", 
        Filters.eq("fullName", 
            Filters.eq("$concat", 
                Arrays.asList("$lastName", ", ", "$firstName")
            )
        )
    )
);

UpdateResult result = collection.updateOne(query, update);

The updated document:

{ "_id" : 1, "firstName" : "John", "lastName" : "Doe", "fullName" : "Doe, John" }


How can you build the pipeline, in Java?

You can use the MongoDB Compass’s Aggregation Pipeline Builder and Export Pipeline to Specific Language.

1 Like

Part 2

And in the sales field, it has the bellow products subfield:

{
        "_id" : "292",
        "sales" : [
                {
                        "products" : [
                                {
                                        "cant" : 28,
                                        "costTotal" : 3693200,
                                        "costUnid" : 131900,
                                        "name" : "Marcadores Edding Color Happy Box Ch20+1 Rotuladores"
                                },
                                {
                                        "cant" : 99,
                                        "costTotal" : 3960000,
                                        "costUnid" : 40000,
                                        "name" : "Set Plumón Y Plumigrafo Stabilo - Unidad A $3250"
                                },
                                {
                                        "cant" : 10,
                                        "costTotal" : 30000,
                                        "costUnid" : 3000,
                                        "name" : "Borrador Miga De Pan Mp20 X 2 Pelikan"
                                },
                                {
                                        "cant" : 91,
                                        "costTotal" : 77987000,
                                        "costUnid" : 857000,
                                        "name" : "Calculadora Fx9860 Graficadora Gll Casio Memoria Sd"
                                },
                                {
                                        "cant" : 15,
                                        "costTotal" : 487500,
                                        "costUnid" : 32500,
                                        "name" : "Resaltador Colores Pastel X6 Original Boss Stabilo"
                                }, 
                                ...
                        ]            
                {
                        "products" : [
                                  ...
                        ]
                },                 
                ...
        ]
}

I want to query the collection ColeccionPrueba using the $set (aggregation) operator, i have the bellow query:

db.ColeccionPrueba.aggregate(
    [
        {
            $match: {
                scores: { $exists: true },
                texts: { $exists: true }
            }
        },
        {
            $project: {
                name: true,
                secondName: true,
                lastName: true,
                secondLastName: true,
                scores: true,
                texts: true
            }
        },
        {
            $set: {
                avg: { $avg: '$scores' }
            }
        },
        {
            $match: {
                $and: [
                    {
                        avg: { $gte: 7 }
                    },
                    {
                        texts: /verde valle rodeado de monta/
                    }
                ]
            }
        },
        {
            $project:{
                texts: false
            }
        },
        {
            $sort: {
                _id: 1
            }
        }
    ]
)

And MongoDB is responding with:

{ “_id” : “104”, “lastName” : “Flórez”, “name” : “Adelaide”, “scores” : [ 8 ], “secondLastName” : “Díaz”, “secondName” : “Regina”, “avg” : 8 }
{ “_id” : “138”, “lastName” : “Arias”, “name” : “Adelaide”, “scores” : [ 7, 9, 8, 5, 4, 9, 9, 5 ], “secondLastName” : “Mejía”, “secondName” : “Eleanor”, “avg” : 7 }
{ “_id” : “279”, “lastName” : “Moreno”, “name” : “Santiago”, “scores” : [ 9 ], “secondLastName” : “Hernández”, “secondName” : “Matías”, “avg” : 9 }
{ “_id” : “299”, “lastName” : “Cardona”, “name” : “Mario”, “scores” : [ 7 ], “secondLastName” : “Rodríguez”, “secondName” : “David”, “avg” : 7 }
{ “_id” : “415”, “lastName” : “Osorio”, “name” : “Alice”, “scores” : [ 9, 5, 9 ], “secondLastName” : “Rojas”, “secondName” : “Valeria”, “avg” : 7.666666666666667 }
{ “_id” : “426”, “lastName” : “Jiménez”, “name” : “Mario”, “scores” : [ 7 ], “secondLastName” : “González”, “secondName” : “Santiago”, “avg” : 7 }
{ “_id” : “428”, “lastName” : “Giraldo”, “name” : “Álvaro”, “scores” : [ 8 ], “secondLastName” : “Rojas”, “secondName” : “Diego”, “avg” : 8 }
{ “_id” : “447”, “lastName” : “Marín”, “name” : “Daniela”, “scores” : [ 7, 5, 9 ], “secondLastName” : “Parra”, “secondName” : “Violet”, “avg” : 7 }
{ “_id” : “502”, “lastName” : “Cárdenas”, “name” : “Valentín”, “scores” : [ 7 ], “secondLastName” : “Restrepo”, “secondName” : “Marcos”, “avg” : 7 }
{ “_id” : “516”, “lastName” : “González”, “name” : “Chloe”, “scores” : [ 7 ], “secondLastName” : “Parra”, “secondName” : “Valeria”, “avg” : 7 }
{ “_id” : “59”, “lastName” : “Parra”, “name” : “Verónica”, “scores” : [ 8 ], “secondLastName” : “Ramírez”, “secondName” : “Amalia”, “avg” : 8 }
{ “_id” : “633”, “lastName” : “Álvarez”, “name” : “Erick”, “scores” : [ 9, 5, 9, 6 ], “secondLastName” : “Mejía”, “avg” : 7.25 }
{ “_id” : “664”, “lastName” : “Rincón”, “name” : “Jorge”, “scores” : [ 7 ], “secondLastName” : “Rodríguez”, “secondName” : “Simón”, “avg” : 7 }
{ “_id” : “690”, “lastName” : “Vargas”, “name” : “Manuel”, “scores” : [ 8 ], “secondLastName” : “Cortes”, “secondName” : “Lucas”, “avg” : 8 }
{ “_id” : “706”, “lastName” : “Valencia”, “name” : “Amalia”, “scores” : [ 7, 8, 7 ], “secondLastName” : “Ramírez”, “secondName” : “Scarlett”, “avg” : 7.333333333333333 }
{ “_id” : “766”, “lastName” : “Cardona”, “name” : “Eleanor”, “scores” : [ 8, 9, 8, 9, 8, 7, 4 ], “secondLastName” : “González”, “secondName” : “Evelyn”, “avg” : 7.571428571428571 }
{ “_id” : “8”, “lastName” : “Montoya”, “name” : “Javier”, “scores” : [ 7, 8, 9, 9, 2, 9, 5, 8 ], “secondLastName” : “Morales”, “secondName” : “Pablo”, “avg” : 7.125 }
{ “_id” : “806”, “lastName” : “Hernández”, “name” : “Ava”, “scores” : [ 8 ], “secondLastName” : “Martínez”, “secondName” : “Renata”, “avg” : 8 }
{ “_id” : “808”, “lastName” : “López”, “name” : “Jorge”, “scores” : [ 9 ], “secondLastName” : “González”, “secondName” : “Sergio”, “avg” : 9 }
{ “_id” : “824”, “lastName” : “Medina”, “name” : “Martín”, “scores” : [ 7, 9, 9 ], “secondLastName” : “Parra”, “secondName” : “Valentín”, “avg” : 8.333333333333334 }
Type “it” for more

But i can’t get the same results with mongo-java-driver on a Java project.

Hi, thanks for your willingness to help.

I have a db with documents like this:

{
        "_id" : "292",
        "address" : {
                "city" : "Leticia",
                "department" : "Amazonas",
                "number" : 96,
                "postalCode" : 703868
        },
        "age" : 25,
        "birthdate" : ISODate("1995-04-06T05:00:00Z"),
        "courses" : [
                {
                        "completed" : false,
                        "progress" : 56,
                        "title" : "flutter-sqlite",
                        "tutor" : {
                                "name" : "Code.org",
                                "link" : "https://code.org/"
                        }
                },
                {
                        "completed" : false,
                        "progress" : 65,
                        "title" : "consumir-apis-javascript",
                        "tutor" : {
                                "name" : "Code.org",
                                "link" : "https://code.org/"
                        }
                },
                {
                        "completed" : false,
                        "progress" : 12,
                        "title" : "consumir-apis-javascript",
                        "tutor" : {
                                "name" : "Scratch",
                                "link" : "https://scratch.mit.edu/"
                        }
                }
        ],
        "email" : "julianlopez06@yahoo.com",
        "lastName" : "López",
        "name" : "Julián",
        "sales" : [
                {
                        "company" : "24",
                        "date" : ISODate("2020-05-03T20:14:55.537Z"),
                        "iva" : 78460479.86,
                        "paymentMethod" : "Débito",
                        "subTotal" : 334489414.14,
                        "time" : "15:14:55",
                        "total" : 412949894,
                        "typeOfSale" : "TV-4"
                },
                {
                        "company" : "23",
                        "date" : ISODate("2019-01-30T17:31:27.210Z"),
                        "iva" : 71200655.86,
                        "paymentMethod" : "Transferencia bancaria",
                        "subTotal" : 303539638.14,
                        "time" : "12:31:27",
                        "total" : 374740294,
                        "typeOfSale" : "TV-5"
                },
                {
                        "company" : "63",
                        "date" : ISODate("2018-11-29T06:27:30.531Z"),
                        "iva" : 38731501.9,
                        "paymentMethod" : "Débito",
                        "subTotal" : 165118508.1,
                        "time" : "01:27:30",
                        "total" : 203850010,
                        "typeOfSale" : "TV-3"
                }
        ],
        "secondLastName" : "Gutiérrez",
        "secondName" : "Jorge",
        "sex" : "M",
        "texts" : [
                "Nasrudin vio a un hombre sentado al borde de un camino, con aire de completa desolación. - ¿Qué te preocupa? –quiso saber. - Hermano mío, no existe nada interesante en mi vida. Tengo dinero suficiente como para no tener que trabajar y estaba viajando para ver si encontraba alguna cosa curiosa en el mundo. Sin embargo, todas las personas que encontré no tienen nada nuevo que decirme y sólo consiguen aumentar mi tedio. Al momento Nasrudin agarró la maleta del hombre y salió corriendo por el camino. Como conocía la región, consiguió distanciarse de él, tomando atajos por campos y colinas. Cuando se distanció bastante, colocó de nuevo la maleta en mitad de la ruta por donde el viajero tendría que pasar y se escondió detrás de una roca. Media hora después el hombre apareció, sintiéndose más deprimido que nunca por haberse cruzado con un ladrón. En cuanto vio la maleta corrió hacia ella y la abrió, anhelante. Al ver que el contenido estaba intacto, elevó sus ojos hacia el cielo con alegría y dio gracias al Señor por la vida. “Ciertas personas sólo entienden el sabor de la felicidad cuando consiguen perderla”, pensó Nasrudin, contemplando la escena. ",
                "A una estación de trenes llega una tarde una señora muy elegante. En la ventanilla le informan que el tren está retrasado y que tardará aproximadamente una hora en llegar a la estación.  Un poco fastidiada, la señora va al puesto de diarios y compra una revista, luego pasa al kiosco y compra un paquete de galletitas y una lata de gaseosa.  Preparada para la forzosa espera, se sienta en uno de los largos bancos del andén. Mientras hojea la revista, un joven se sienta a su lado y comienza a leer un diario.  Imprevistamente la señora ve, por el rabillo del ojo, cómo el muchacho, sin decir una palabra, estira la mano, agarra el paquete de galletitas, lo abre y después de sacar una comienza a comérsela despreocupadamente. La mujer está indignada. No está dispuesta a ser grosera, pero tampoco a hacer de cuenta que nada ha pasado; así que, con un gesto ampuloso, toma el paquete y saca una galletita que exhibe frente al joven y se la come mirándolo fijamente.  Por toda respuesta, el joven sonríe… y toma otra galletita.  La señora gime un poco, toma una nueva galletita y, con ostensibles señales de fastidio, se la come sosteniendo otra vez la mirada en el muchacho. El diálogo de miradas y sonrisas continúa entre galleta y galleta. La señora cada vez más irritada, el muchacho cada vez más divertido.  Finalmente, la señora se da cuenta de que en el paquete queda sólo la última galletita. “No podrá ser tan caradura”, piensa, y se queda como congelada mirando alternativamente al joven y a las galletitas. Con calma, el muchacho alarga la mano, toma la última galletita y, con mucha suavidad, la corta exactamente por la mitad. Con su sonrisa más amorosa le ofrece media a la señora. - Gracias - dice la mujer tomando con rudeza la media galletita. - De nada – contesta el joven sonriendo angelical mientras come su mitad.  El tren llega. Furiosa, la señora se levanta con sus cosas y sube al tren. Al arrancar desde el vagón ve al muchacho todavía sentado en el banco del andén y piensa: “Insolente”. Siente la boca reseca de ira. Abre la cartera para sacar la lata de gaseosa y se sorprende al encontrar, cerrado, su paquete de galletitas… ¡intacto! ",
                "“Había una vez un rey el cual amaba los animales, que un día recibió como regalo dos hermosas crías de halcón. El rey los entregó a un maestro cetrero para que los alimentara, cuidara y entrenara. Pasó el tiempo y después de unos meses en los que los halcones crecieron el cetrero pidió una audiencia con el rey para explicarle que si bien uno de los halcones había alzado ya el vuelo con normalidad, el otro había permanecido en la misma rama desde que llegó, no emprendiendo el vuelo en ningún momento. Ello preocupó en gran medida al rey, que mandó llamar a múltiples expertos para solucionar el problema del ave. Sin éxito. Desesperado, decidió ofrecer una recompensa a quien lograra que el ave consiguiera volar. Al día siguiente el rey pudo ver cómo el ave ya no estaba en su rama, sino que volaba libremente por la región. El soberano mandó llamar al autor de tal prodigio, encontrándose con que quien lo había logrado era un joven campesino. Poco antes de entregarle su recompensa, el rey le preguntó cómo lo había logrado. El campesino le contestó que simplemente había partido la rama, no quedándole otra opción al halcón que echar a volar.” Una breve historia que nos sirve para entender que a veces nos creemos incapaces de hacer las cosas por miedo, a pesar de que la experiencia demuestra más que a menudo que en el fondo sí tenemos la capacidad para conseguir realizarlas: el ave no confiaba en sus posibilidades para volar pero una vez se puso a prueba no le quedó más remedio que intentarlo, algo que le condujo al éxito.",
                "“Había una vez un zorro que caminaba, sediento, por el bosque. Mientras lo hacía vio en lo alto de la rama de un árbol un racimo de uvas, las cuales deseó al instante al servirle para refrescarse y apagar su sed. El zorro se acercó al árbol e intentó alcanzar las uvas, pero estaban demasiado altas. Tras intentarlo una y otra vez sin conseguirlo, el zorro finalmente se rindió y se alejó. Viendo que un pájaro había visto todo el proceso se dijo en voz alta que en realidad no quería las uvas, dado aún no estaban maduras, y que en realidad había cesado el intento de alcanzarlas al comprobarlo.” Otra interesante historia corta en forma de fábula que nos enseña que a menudo nos intentamos convencer a nosotros mismos de no querer algo e incluso llegamos a despreciar dicho algo por el hecho de que encontramos difícil llegar a alcanzarlo.",       
         
              ...              

        ]
}

In an Aggregation Update operation $set is used. In an Aggregation Query, the same operation is performed using the $addFields. From the documentation for $set:

The $set stage is an alias for $addFields.

What is the difficulty you are facing using the $set aggregation stage in Java?

Thanks for you help, I’m new using MongoDB. I have a project with Java and I can not find much information about that.

This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.