[MONGODB] 봄의 데이터 몽고에서 MongoDB를의 $ 조회
MONGODB봄의 데이터 몽고에서 MongoDB를의 $ 조회
나는 새로운 MongoDB를 그리고 난 자바 스프링 $ 조회에 문제가 있습니다.
나는 봄 데이터에이 쉘을 사용하고 싶습니다
db.NewFeed.aggregate([
{
$match : {username : "user001"}
},
{
$lookup:
{
from: "NewfeedContent",
localField: "content.contentId",
foreignField: "_id",
as: "NewfeedContent"
}
}
])
아직 구글하지만 답변을 발견했다.
해결법
-
==============================
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.봄 데이터 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.다음은 그 예이다 :
다음은 그 예이다 :
컬렉션 게시물
{ "_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.너무 늦기이 답변을하지만, 수도 같은 문제에 직면하고있는 다른 도움이됩니다. 당신이 스프링 부팅 데이터 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.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());
from https://stackoverflow.com/questions/36145229/mongodb-lookup-in-spring-data-mongo by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 기록에 날짜 누락 기입 (0) | 2019.12.25 |
---|---|
[MONGODB] MongoDB를에서, 사용자를 포함, 각 대화의 마지막 메시지 목록 (0) | 2019.12.25 |
[MONGODB] 몽고 스크립트에 환경 변수를 전달하는 방법 (0) | 2019.12.25 |
[MONGODB] MongoDB를하고 드라이버는 문서 요소의 순서를 보존 할 수 있습니다 (0) | 2019.12.25 |
[MONGODB] 이 쿼리 구문 에러를 mongoexport : 예기치 않은 식별자 (0) | 2019.12.25 |