2017-09-26 2 views
0

포함 된 배열의 이전 및 다음 요소를 가져옵니다 : 내가 돌아갑니다 다음 쿼리를했습니다MongoDB를 : 나는 다음과 같은 구조를 가지고있는 데이터베이스있다

{ 
    "_id" : ObjectId("59b8d72ab515211f3c161c4b"), 
    "Transport_event_id" : 1, 
    "Carrier_id" : 23, 
    "Payload_id" : 0, 
    "StartTime" : 214392.0, 
    "EndTime" : 362707.0, 
    "Move_events" : [ 
     { 
      "Timestamp" : 214398, 
      "x_pos" : 13, 
      "y_pos" : 202 
     },{ 
      "Timestamp" : 214845, 
      "x_pos" : 12, 
      "y_pos" : 202 
     },{ 
      "Timestamp" : 216399, 
      "x_pos" : 12, 
      "y_pos" : 216 
     },{ 
      "Timestamp" : 216842, 
      "x_pos" : 11, 
      "y_pos" : 216 
     },{ 
      "Timestamp" : 219586, 
      "x_pos" : 10, 
      "y_pos" : 216 
     } 
    ] 
} 

다음 두 요소가 배열을 형성 이후에 특정 타임 스탬프. 내가 필요로 무엇

var cursor = db.Transport_eventBeta.aggregate([ 
    { "$match": { "StartTime": { "$lte": query_time } } }, 
    { "$match": { "EndTime": { "$gte": query_time } } }, 
    { 
     "$project": { 
      "Move_events": { 
       "$let": { 
        "vars": { 
         "filtered": { 
          "$filter": { 
           "input": "$Move_events", 
           "as": "event", 
           "cond": { "$lte": ["$$event.Timestamp" , query_time] } 
          } 
         } 
        }, 
        "in": { 
         "$slice": [ 
          "$Move_events", 
          {"$size": "$$filtered"}, 
          2 
         ] 
        } 
       } 
      }, 
      "Carrier_id": 1  
     } 
    } 
]) 
while (cursor.hasNext()) { 
    print(cursor.next()); 
} 

는 befor을하고이 특정 타임 스탬프 후 문서를 이다. 이 종류의 어떤 것 :

"$slice": [ 
    "$Move_events", 
    {"$size": "$$filtered"} - 1, 
    2 
] 

그러나 이것은 작동하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까? 두 개의 별도 쿼리는 기간 때문에 옵션이 없습니다.

답변

1

3.4에서 아래 집계 쿼리를 시도 할 수 있습니다.

쿼리 후 이벤트 전에 Move_events를 얻을 수 $arrayElemAt 다음에 입력 timestamp 미만의 타임 스탬프와 함께 이벤트를 계속 Move_events를 필터링합니다.

db.Transport_eventBeta.aggregatee([ 
    { 
    "$match": { 
     "StartTime": { 
     "$lte": query_time 
     }, 
     "EndTime": { 
     "$gte": query_time 
     } 
    } 
    }, 
    { 
    "$project": { 
     "Move_events": { 
     "$let": { 
      "vars": { 
      "filtered": { 
       "$filter": { 
       "input": "$Move_events", 
       "as": "event", 
       "cond": { 
        "$lte": [ 
        "$$event.Timestamp", 
        query_time 
        ] 
       } 
       } 
      } 
      }, 
      "in": [ 
      { 
       "$arrayElemAt": [ 
       "$Move_events", 
       { 
        "$subtract": [ 
        { 
         "$size": "$$filtered" 
        }, 
        1 
        ] 
       } 
       ] 
      }, 
      { 
       "$arrayElemAt": [ 
       "$Move_events", 
       { 
        "$size": "$$filtered" 
       } 
       ] 
      } 
      ] 
     } 
     } 
    } 
    } 
]) 
+0

나는 또한 $ indexOfArray를 사용하여 무언가를하려고 시도하고있었습니다. 이 문제는 이러한 요소의 정확한 시간을 알 수 없다는 것입니다. 예를 들어'$ indexOfArray'는 이벤트를 befor 및 뒤에 얻으려면 214845의 정확한 타임 스탬프가 필요합니다. [여기에서 시험] (https://gist.github.com/iwaynee/5ad41b8db2260019eaf524b67910bd27) BTW한다 : $ substract' '에서 단지 하나가 아닌 -1 – noscript

+0

우리 querys을 조합하여 솔루션을 발견하는 경우. https://gist.github.com/iwaynee/4321c696e08acfad5e4042b32081d4b9 위의 검색어를 수정할 수 있다면 답변을 수락하겠습니다. :) – noscript

관련 문제