Consider collection with whitespace in field, in DB if there is white space if we group them “Ravi”, ” Ravi ” , consider as total 2 values. but it should consider as single value. So I have trim in Group. I had performed in DB. But I don’t know how can I trim and group value in Springboot. We can use Aggregation for this in Springboot. but don’t how to use trim. Kindly help on this
Sample Collection:
[ { "name": "ravi", "DOB": "04-02-2000", "Blood": "A1+" }, { "name": "ravi ", "DOB": "05-03-2000", "Blood": "A1+" }, { "name": "kumar ", "DOB": "02-04-2000", "Blood": "A1+" }, { "name": "kumar", "DOB": "03-05-2000", "Blood": "A1+" } ]
MongoDB Operation:
db.collection.aggregate({ "$group": { _id: { $trim: { input: "$name" } }, doc: { "$first": "$$ROOT", } } }, { "$replaceRoot": { "newRoot": "$doc" } })
Output:
[ { "Blood": "A1+", "DOB": "04-02-2000", "_id": ObjectId("5a934e000102030405000000"), "name": "ravi" }, { "Blood": "A1+", "DOB": "02-04-2000", "_id": ObjectId("5a934e000102030405000002"), "name": "kumar " } ]
Advertisement
Answer
Not possible via standard API.
Workaround: We need to add extra $addFields
to trim the name
field before applying $group
stage.
@Autowired private MongoTemplate template; ... Aggregation agg = Aggregation.newAggregation( Aggregation.addFields() .addFieldWithValue("name", Trim.valueOf("name")).build(), Aggregation.group("name") .first("$$ROOT").as("doc"), Aggregation.replaceRoot("doc") ); ... template.aggregate(agg, inputType, outputType);
Note: Since you were manipulating the name
field in the first stage, MongoDB wouldn’t use indexes, so we can add an extra stage to the pipeline.