sql >> Databasteknik >  >> NoSQL >> MongoDB

Jag behöver hämta MongoDBs objekt bara med filtereds array-objekt

Så i princip måste du göra filter. MongoTemplate erbjuder mycket drift för mongodb, om vissa metoder inte finns i MongoTemplate, kan vi gå med Bson Document mönster. Testa i så fall den här artikeln:Trick to covert mongo shell query.

Egentligen behöver du en Mongo-fråga som liknar följande. Använder $addFields en av metoderna som visas nedan. Men du kan använda $project , $set etc. Här $addFields skriver över dina history_dates . (Det används för att lägga till nya fält i dokumentet också).

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

Arbetande Mongo lekplats.

Du måste konvertera detta till vårdata. Alltså @Autowired Mongomallen i din klass.

 @Autowired
    MongoTemplate mongoTemplate;

Metoden är,

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

Mongo-mallen tillhandahåller inte tilläggsmetoder för $addFields och $filter . Så vi går bara med bson dokumentmönster. Jag har inte testat detta under våren.




  1. MongoDB Visa allt innehåll från alla samlingar

  2. Distribuera MongoDB i ett Amazon Virtual Private Cloud (VPC)

  3. skjuta in objekt i arrayschema i Mongoose

  4. Så här visar du din featureCompatibilityVersion i MongoDB