MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

J'ai besoin de récupérer l'objet de MongoDB uniquement avec l'élément de tableau de filtered

Donc, fondamentalement, vous devez faire un filtre. MongoTemplate offre beaucoup d'opérations pour mongodb, si certaines méthodes n'existent pas dans MongoTemplate, nous pouvons utiliser Bson Document modèle. Dans ce cas, essayez cet article :Astuce pour dissimuler une requête mongo shell.

En fait, vous avez besoin d'une requête Mongo comme suit. Utilisation de $addFields l'une des méthodes présentées ci-dessous. Mais vous pouvez utiliser $project , $set etc. Ici $addFields écrase vos history_dates . (Il sert également à ajouter de nouveaux champs au document).

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

Aire de jeux Mongo fonctionnelle.

Vous devez convertir cela en données de printemps. Donc @Autowired le MongoTemplate dans votre classe.

 @Autowired
    MongoTemplate mongoTemplate;

La méthode est,

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

Le modèle Mongo ne fournit pas de méthodes d'ajout pour $addFields et $filter . Donc, nous allons simplement avec le modèle de document bson. Je n'ai pas testé cela au printemps.