MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Ich muss das Objekt von MongoDB nur mit dem Array-Element von gefiltert abrufen

Im Grunde müssen Sie also filtern. MongoTemplate bietet viel Betrieb für mongodb, wenn einige Methoden in MongoTemplate nicht vorhanden sind, können wir mit Bson Document gehen Muster. Probieren Sie in diesem Fall diesen Artikel aus:Trick zur verdeckten Mongo-Shell-Abfrage.

Eigentlich brauchen Sie eine Mongo-Abfrage wie die folgende. Verwendung von $addFields eine der unten gezeigten Methoden. Aber Sie können $project verwenden , $set usw. Hier $addFields überschreibt Ihre history_dates . (Es wird auch verwendet, um dem Dokument neue Felder hinzuzufügen).

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

Funktionierender Mongo-Spielplatz.

Sie müssen dies in Federdaten umwandeln. Also @Autowired das MongoTemplate in Ihrer Klasse.

 @Autowired
    MongoTemplate mongoTemplate;

Die Methode ist,

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

Die Mongo-Vorlage bietet keine Add-Methoden für $addFields und $filter . Also gehen wir einfach mit bson document pattern. Ich habe das im Frühjahr nicht getestet.