복붙노트

[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. ==============================

    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. ==============================

    2.나는 같은 긴장을 풀고의 사용과 여분의 일치에 의해 달성 될 수있다 생각합니다. 봄 몽고 드라이버는 언 와인드에 대한 지원을 제공하며 만약 비트 청소기를 보인다.

    나는 같은 긴장을 풀고의 사용과 여분의 일치에 의해 달성 될 수있다 생각합니다. 봄 몽고 드라이버는 언 와인드에 대한 지원을 제공하며 만약 비트 청소기를 보인다.

    aggregate([{
     $match: {
        "_id": 1
       }
     }, {
      $unwind : "$data"
     },{
       $match : {'data.timestamp' : {$gte : 1483537204000, $lte : 1483537214000}}
     }, {
      $group : {
          _id : $_id,
          data : {$push:$data}
      }
     }])
    
  3. ==============================

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