[MONGODB] 문서 및 MongoDB를에 조건을 일치의 모든 하위 문서 (사용 봄) 조회
MONGODB문서 및 MongoDB를에 조건을 일치의 모든 하위 문서 (사용 봄) 조회
I는 다양한 센서로부터 데이터를 기억하여 MongoDB있다. 그것은 다음과 같은 구조를 가지고 :
{
"_id" : 1,
"sensorName" : "Heart Rate",
"samplePeriod" : 1000,
"data" : [
{
"timestamp" : NumberLong("1483537204046"),
"dataPoints" : [ 68 70 ]
},
{
"timestamp" : NumberLong("1483537206046"),
"dataPoints" : [ 68 70 ]
}
]
}
{
"_id" : 2,
"sensorName" : "Ambient Light",
"samplePeriod" : 500,
"data" : [
{
"timestamp" : NumberLong("1483537204058"),
"dataPoints" : [ 56, 54, 54, 54 ]
},
{
"timestamp" : NumberLong("1483537206058"),
"dataPoints" : [ 56, 54, 54, 54 ]
}
]
}
이제 예를 들어 나는 "심장 박동을"필요 - 문서를 모든 필드와 "데이터"의 사람들과 - 조건 "1483537204000와 1483537214000 사이의 타임 스탬프를"일치하는 하위.
나는 이미 다른 질문에 몽고 쉘에서이 작업을 수행하는 방법에 대한 대답을 얻었다. 이 코드를 참조하십시오 :
aggregate([{
$match: {
"_id": 1
}
}, {
"$project": {
"_id": 1,
"sensorName": 1,
"samplePeriod": 1,
"data": {
"$filter": {
"input": "$data",
"as": "result",
"cond": {
$and: [{
$gte: ["$$result.timestamp", 1483537204000]
}, {
$lte: ["$$result.timestamp", 1483537214000]
}]
}
}
}
}
}])
그러나 어떻게 자바 스프링 데이터에서이 작업을 수행합니까? 봄 - 데이터 $ 필터 같은 것이없는 것 같다. 해결 방법이 있습니까?
$ 필터 어쨌든 어떻게 효율적인가요? 당신은 MongoDB의에서 이러한 종류의 데이터 구조의보다 효율적인 / 실용적인 방법을 생각할 수 있는가?
사전에 감사합니다!
해결법
-
==============================
1.당신은 봄 몽고 데이터 의존성에 제공 MongoTemplate의 사용을 확인해야합니다. 현재 릴리스 버전에서 $ 필터에 대한 기본 지원에는 밖으로는 없다. AggressionExpression를 사용합니다. 프로젝트의 돌출부 아래에 포함합니다. 1.8.5 스프링 몽고 데이터 버전을 사용합니다.
당신은 봄 몽고 데이터 의존성에 제공 MongoTemplate의 사용을 확인해야합니다. 현재 릴리스 버전에서 $ 필터에 대한 기본 지원에는 밖으로는 없다. AggressionExpression를 사용합니다. 프로젝트의 돌출부 아래에 포함합니다. 1.8.5 스프링 몽고 데이터 버전을 사용합니다.
Aggregation aggregation = newAggregation( match(Criteria.where("_id").is(1)), project( "_id", "sensorName", "samplePeriod").and(new AggregationExpression() { @Override public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) { DBObject filter = new BasicDBObject("input", "$data").append("as", "result").append("cond", new BasicDBObject("$and", Arrays.<Object> asList(new BasicDBObject("$gte", Arrays.<Object> asList("$$result.timestamp", 1483537204000L)), new BasicDBObject("$lte", Arrays.<Object> asList("$$result.timestamp", 1483537214000L))))); return new BasicDBObject("$filter", filter); } }).as("data") ); List<BasicDBObject> dbObjects = monoTemplate.aggregate(aggregation, "collectionname", BasicDBObject.class).getMappedResults();
-
==============================
2.나는 같은 긴장을 풀고의 사용과 여분의 일치에 의해 달성 될 수있다 생각합니다. 봄 몽고 드라이버는 언 와인드에 대한 지원을 제공하며 만약 비트 청소기를 보인다.
나는 같은 긴장을 풀고의 사용과 여분의 일치에 의해 달성 될 수있다 생각합니다. 봄 몽고 드라이버는 언 와인드에 대한 지원을 제공하며 만약 비트 청소기를 보인다.
aggregate([{ $match: { "_id": 1 } }, { $unwind : "$data" },{ $match : {'data.timestamp' : {$gte : 1483537204000, $lte : 1483537214000}} }, { $group : { _id : $_id, data : {$push:$data} } }])
-
==============================
3.다음과 같이 봄 데이터 MongoDB를 1.10 RC1 (잉걸스가), (작성 등) 2.0 M2 (케이) 버전은 $ 필터에 대한 지원을 추가 한이 구현 될 수있다 :
다음과 같이 봄 데이터 MongoDB를 1.10 RC1 (잉걸스가), (작성 등) 2.0 M2 (케이) 버전은 $ 필터에 대한 지원을 추가 한이 구현 될 수있다 :
Aggregation.newAggregation(Entity.class, match(Criteria.where("_id").is(1)), project("sensorName", "samplePeriod") .and( filter("data") .as("item") .by( GTE.of(field("item.timestamp"), 1483537204000) .LTE.of(field("item.timestamp"), 1483537214000) ) ).as("data") )
from https://stackoverflow.com/questions/41467386/query-a-document-and-all-of-its-subdocuments-that-match-a-condition-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽구스의 최대 값을 얻을 (0) | 2019.12.26 |
---|---|
[MONGODB] MongoDB를 찾을 () 및 findOne () 메소드는 다른 결과를 도시 (0) | 2019.12.26 |
[MONGODB] JasperReports에 도서관과 MongoDB를 가진 GeneratePDF (0) | 2019.12.26 |
[MONGODB] 고정 표시기 컨테이너 내부 MongoDB를 연결 오류 (0) | 2019.12.26 |
[MONGODB] CSV로 하위 문서에서 mongoexport 필드 (0) | 2019.12.26 |