sql >> Base de Datos >  >> NoSQL >> MongoDB

Necesito recuperar el objeto de MongoDB solo con el elemento de matriz filtrado

Entonces, básicamente, necesitas hacer un filtro. MongoTemplate ofrece muchas operaciones para mongodb, si algunos métodos no existen en MongoTemplate, podemos ir con Bson Document patrón. En ese caso, prueba este artículo:Truco para encubrir la consulta de mongo shell.

En realidad, necesita una consulta de Mongo algo como lo siguiente. Usando $addFields uno de los métodos que se muestran a continuación. Pero puedes usar $project , $set etc. Aquí $addFields sobrescribe su history_dates . (También se usa para agregar nuevos campos al documento).

{
    $addFields: {
        history_dates: {
            $filter: {
                input: "$history_dates",
                cond: {
                    $and: [{
                            $gt: ["$$this", "23/07/2020"]
                        },
                        {
                            $lt: ["$$this", "24/07/2020"]
                        }
                    ]
                }
            }
        }
    }
}

Zona de juegos de trabajo de Mongo.

Necesita convertir esto en datos de primavera. Así que @Autowired MongoTemplate en tu clase.

 @Autowired
    MongoTemplate mongoTemplate;

El método es,

public List<Object> filterDates(){

    Aggregation aggregation = Aggregation.newAggregation(
        a->new Document("$addFields",
            new Document("history_dates",
                new Document("$filter",
                    new Document("input","$history_dates")
                    .append("cond",
                        new Document("$and",
                            Arrays.asList(
                                new Document("$gt",Arrays.asList("$$this","23/07/2020")),
                                new Document("$lt",Arrays.asList("$$this","24/07/2020"))                            
                            )
                        )
                    )
                )
            )       
        )
    ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());
    return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_CLASS.class), Object.class).getMappedResults();
}

La plantilla de Mongo no proporciona métodos de adición para $addFields y $filter . Así que vamos con el patrón de documento bson. No he probado esto en Spring.