javamongodbspring-mongo

Mongodb $lookup in Spring data mongo


I'm a new Mongodb and I have a problem with $lookup with java spring.

I would like to use this shell in Spring data

db.NewFeed.aggregate([
    {
        $match : {username : "user001"}
    },
    {
      $lookup:
        {
          from: "NewfeedContent",
          localField: "content.contentId",
          foreignField: "_id",
          as: "NewfeedContent"
        }
   }
])

I found on Google but no answer yet.


Solution

  • Not every "new" feature makes it immediately into abstraction layers such as .

    So instead, all you need do is define a class that uses the AggregationOperation interface, which will instead take a BSON Object specified directly as it's content:

    public class CustomAggregationOperation implements AggregationOperation {
        private DBObject operation;
    
        public CustomAggregationOperation (DBObject operation) {
            this.operation = operation;
        }
    
        @Override
        public DBObject toDBObject(AggregationOperationContext context) {
            return context.getMappedObject(operation);
        }
    }
    

    Then you can use in your aggregation like this:

    Aggregation aggregation = newAggregation(
        match(
            Criteria.where("username").is("user001")
        ),
        new CustomAggregationOperation(
            new BasicDBObject(
                "$lookup",
                new BasicDBObject("from", "NewFeedContent")
                    .append("localField","content.contentId")
                    .append("foreignField", "_id")
                    .append("as", "NewFeedContent")
            )
        )
    )
    

    Which shows the custom class mixed with the built in match() pipeline helper.

    All that happens underneath each helper is that they serialize to a BSON representation such as with DBObject anyway. So the constructor here just takes the object directly, and returns it directly from .toDBObject(), which is the standard method on the interface that will be called when serializing the pipline contents.