sql >> Database >  >> NoSQL >> MongoDB

opzoeken in mongodb-aggregatie

Aangezien je geneste arrays hebt, moet je de $unwind . toepassen operator eerst om de ingesloten documenten te denormaliseren voordat de $lookup pijplijn (tenzij u ze al hebt afgevlakt in uw aggregatiebewerking):

db.personaddress.aggregate([
    { "$unwind": "$address" },
    { "$unwind": "$address.location" },
    {
        "$lookup": {
            "from": "places", 
            "localField": "address.location.place._id", 
            "foreignField": "_id", 
            "as": "address.location.place", 
        }
    }
])

die vervolgens kan worden geïmplementeerd als (niet getest):

LookupOperation lookupOperation = LookupOperation.newLookup()
    .from("places")
    .localField("address.location.place._id")
    .foreignField("_id")
    .as("address.location.place");

Aggregation agg = newAggregation(
    unwind("address"),
    unwind("address.location"),
    lookupOperation  
);

AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(
    agg, PersonAddressDocument.class, OutputDocument.class
);

Als uw Spring Data-versie dit niet ondersteunt, is een tijdelijke oplossing het implementeren van de AggregationOperation interface voor het opnemen van een DBObject :

public class CustomGroupOperation implements AggregationOperation {
    private DBObject operation;

    public CustomGroupOperation (DBObject operation) {
        this.operation = operation;
    }

    @Override
    public DBObject toDBObject(AggregationOperationContext context) {
        return context.getMappedObject(operation);
    }
}

Implementeer vervolgens de $lookup operatie als een DBObject in de aggregatiepijplijn:

DBObject lookupOperation = (DBObject)new BasicDBObject(
    "$lookup", new BasicDBObject("from", "places")
        .append("localField", "address.location.place._id")
        .append("foreignField", "_id")
        .append("as", "address.location.place")       
);

die u vervolgens kunt gebruiken als:

Aggregation agg = newAggregation(
    unwind("address"),
    unwind("address.location"),
    lookupOperation  
);

AggregationResults<OutputDocument> aggResults = mongoTemplate.aggregate(
    agg, PersonAddressDocument.class, OutputDocument.class
);


  1. MongoDB/NoSQL:geschiedenis van documentwijzigingen bijhouden

  2. Redis - Verlopen indexen worden niet verwijderd

  3. Selecteer Max() met group by in mongodb

  4. Welke beveiligingsmechanismen heeft Meteor?