MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Ho bisogno di recuperare l'oggetto di MongoDB solo con l'elemento dell'array filtrato

Quindi in pratica devi fare il filtro. MongoTemplate offre molte operazioni per mongodb, se alcuni metodi non esistono in MongoTemplate, possiamo usare Bson Document modello. In tal caso, prova questo articolo:Trucco per nascondere la query della shell mongo.

In realtà hai bisogno di una query Mongo qualcosa come seguire. Usando $addFields uno dei metodi mostrati di seguito. Ma puoi usare $project , $set ecc. Qui $addFields sovrascrive le tue history_dates . (Utilizza anche per aggiungere nuovi campi al documento).

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

Parco giochi Mongo funzionante.

Devi convertirlo in dati primaverili. Quindi @Autowired il MongoTemplate nella tua classe.

 @Autowired
    MongoTemplate mongoTemplate;

Il metodo è,

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();
}

Il modello Mongo non fornisce metodi di aggiunta per $addFields e $filter . Quindi andiamo solo con il modello di documento bson. Non l'ho testato in primavera.