복붙노트

[MONGODB] 봄의 데이터 몽고에서 MongoDB를의 $ 조회

MONGODB

봄의 데이터 몽고에서 MongoDB를의 $ 조회

나는 새로운 MongoDB를 그리고 난 자바 스프링 $ 조회에 문제가 있습니다.

나는 봄 데이터에이 쉘을 사용하고 싶습니다

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

아직 구글하지만 답변을 발견했다.

해결법

  1. ==============================

    1.아니 모든 "새로운"기능은 스프링 몽고 등의 추상화 레이어로 즉시 있습니다.

    아니 모든 "새로운"기능은 스프링 몽고 등의 추상화 레이어로 즉시 있습니다.

    그래서 그 대신, 당신이 할 필요가 모든는 지정된 직접의 내용으로 대신 BSON 개체를 취할 것 AggregationOperation 인터페이스를 사용하는 클래스를 정의 :

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

    그럼 당신은이 같이 당신의 집계에 사용할 수 있습니다 :

    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")
            )
        )
    )
    

    어떤 쇼 경기 () 파이프 라인 도우미에 내장 된 혼합 사용자 정의 클래스.

    각 도우미 아래에 일어나는 모든는 어쨌든 같은 DBOBJECT와 같은 BSON 표현으로 직렬화한다는 것입니다. 여기에 생성자는 직접 오브젝트를하고 pipline 내용을 직렬화 할 때 호출되는 인터페이스의 표준 방법입니다 .toDBObject ()에서 직접 반환을 그래서.

  2. ==============================

    2.봄 데이터 MongoDB를 두 개의 모음을 결합

    봄 데이터 MongoDB를 두 개의 모음을 결합

    직원 클래스

    class Employee {
        private String _id;
        private String name;
        private String dept_id;
    }
    

    부서 클래스

    class Department {
        private String _id;
        private String dept_name;
    }
    

    직원 결과 클래스

    public class EmpDeptResult {
    
        private String _id;
        private String name;
        private List<Object> departments;
    }
    

    EmployeeService 클래스

    public class EmployeeService {
    
        @Autowired
        private MongoTemplate mongoTemplate;
    
        private Logger LOGGER = LoggerFactory.getLogger(EmployeeService.class);
    
        public void lookupOperation(){
        LookupOperation lookupOperation = LookupOperation.newLookup()
                            .from("Department")
                            .localField("dept_id")
                            .foreignField("_id")
                            .as("departments");
    
        Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(Criteria.where("_id").is("1")) , lookupOperation);
            List<EmpDeptResult> results = mongoTemplate.aggregate(aggregation, "Employee", EmpDeptResult.class).getMappedResults();
            LOGGER.info("Obj Size " +results.size());
        }
    }
    
  3. ==============================

    3.다음은 그 예이다 :

    다음은 그 예이다 :

    컬렉션 게시물

    {
    "_id" : ObjectId("5a198074ed31adaf5d79fe8a"),
    "title" : "Post 1",
    "authors" : [1, 2]
    },
    {
    "_id" : ObjectId("5a198074ed31adaf5d79fe8d"),
    "title" : "Post 2",
    "authors" : [2]
    }
    

    컬렉션 사용자

    {
    "_id" : ObjectId("5a18b483ed31ada08fd6ed82"),
    "userId" : 1,
    "name" : "Vinod Kumar"
    },
    {
    "_id" : ObjectId("5a18b483ed31ada08fd6ed83"),
    "userId" : 2,
    "name" : "Jim Hazel"
    },
    {
    "_id" : ObjectId("5a18b483ed31ada08fd6ed84"),
    "userId" : 3,
    "name" : "Alex Wong"
    }
    

    조회와 일치와 MongoDB의 쿼리

    db.users.aggregate([
    {
      $lookup:
        {
          from: "users",
          localField: "userid",
          foreignField: "authors",
          as: "post"
        }
      },
      {
         $match: { "post": { $ne: [] } }
      }
    ]).pretty()
    

    봄 Mongoopration 구문

    LookupOperation lookupOperation = LookupOperation.newLookup().
                from("posts").
                localField("userid").
                foreignField("authors").
                as("post");
    
    AggregationOperation match = Aggregation.match(Criteria.where("post").size(1));
    
    
    Aggregation aggregation = Aggregation.newAggregation(lookupOperation, match);
    
    List<BasicDBObject> results = mongoOperation.aggregate(aggregation, "users", BasicDBObject.class).getMappedResults();
    
  4. ==============================

    4.너무 늦기이 답변을하지만, 수도 같은 문제에 직면하고있는 다른 도움이됩니다. 당신이 스프링 부팅 데이터 MongoDB를-2.0 이상 버전을 사용하는 경우,이를 구현하는 쉬운 방법이있다.

    너무 늦기이 답변을하지만, 수도 같은 문제에 직면하고있는 다른 도움이됩니다. 당신이 스프링 부팅 데이터 MongoDB를-2.0 이상 버전을 사용하는 경우,이를 구현하는 쉬운 방법이있다.

    AggregationOperation match = Aggregation.match(Criteria.where("username").is("user001")));
    AggregationOperation query = Aggregation.lookup("NewfeedContent", "content.contentId", "_id", "NewfeedContent");
    // If you want to unwind
    //AggregationOperation unwind = Aggregation.unwind("Patient");
    Aggregation agr = Aggregation.newAggregation(query, match, unwind);
    AggregationResults<Document> result = springTemplate.aggregate(agr, "CollectionName", Document.class);
    
  5. ==============================

    5.3 컬렉션에 가입하려면 아래 사용할 수

    3 컬렉션에 가입하려면 아래 사용할 수

    MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
    
    DB db = mongoClient.getDB( "DBname" );
    
    BasicDBObject query = BasicDBObject.parse("{$match:{_id:61188}},\n" +
            "   {\n" +
            "     $lookup:\n" +
            "       {\n" +
            "         from: \"CustomerDetails\",\n" +
            "         localField: \"supplierId\",\n" +
            "         foreignField: \"supplierId\",\n" +
            "         as: \"newfield\"\n" +
            "       }\n" +
            "  }\n" +
            "  ,  {\n" +
            "     $lookup:\n" +
            "       {\n" +
            "         from: \"ItemDetails\",\n" +
            "         localField: \"supplierId\",\n" +
            "         foreignField: \"supplierId\",\n" +
            "         as: \"newfield\"\n" +
            "       }\n" +
            "  }");
    
    AggregationOutput dumps = db.getCollection("HeaderInfo").aggregate(query);
    
    System.out.println("result="+dumps.results());
    
  6. from https://stackoverflow.com/questions/36145229/mongodb-lookup-in-spring-data-mongo by cc-by-sa and MIT license