2017-10-20 6 views
2

데이터베이스에 삽입 된 데이터의 마지막 시퀀스에서 첫 번째 항목을 가져와야합니다. 그것은 하나의 쿼리에서 할 수 있다면 좋을 것입니다.데이터가있는 마지막 시퀀스에서 첫 번째 항목 가져 오기

의 내가 같은 데이터가 있다고 가정 해 봅시다 :

{_id:......,ts:Date("2017-10-24T00:00:00.000Z"), id: 1, ok: false} 
{_id:......,ts:Date("2017-10-23T00:00:00.000Z"), id: 1, ok: false} 
{_id:......,ts:Date("2017-10-22T00:00:00.000Z"), id: 1, ok: true} 
{_id:......,ts:Date("2017-10-21T00:00:00.000Z"), id: 1, ok: true} 
{_id:......,ts:Date("2017-10-20T00:00:00.000Z"), id: 1, ok: false} 
{_id:......,ts:Date("2017-10-21T00:00:00.000Z"), id: 2, ok: false} 
{_id:......,ts:Date("2017-10-20T00:00:00.000Z"), id: 2, ok: true} 

및 확인이 거짓 일 때 현장 확인은 마지막 순서로 거짓 때마다 ID의 첫 번째 항목을 얻을 필요가있다.

{_id:......,ts:Date("2017-10-23T00:00:00.000Z"), id: 1, ok: false} 

하지만 이드마다 필요합니다. 내가 확장 성을 수행하는 것은 불가능한 것처럼 보이므로 데이터베이스에 대해 수천 개의 쿼리가 필요하지는 않습니다. 하나의 ID를 위해 그것을 만드는 방법을 알고 있지만 모든 ID에 대한 쿼리를 보내야 할 경우 데이터베이스가 압도적입니다.

이 내 현재 쿼리입니다 :

{ 
    $sort : {ts : -1} 
}, 
{ 
    $match : {"ok" : true } 
}, 
{ 
    $group : { 
     _id : {id : "$id"}, 
     last : {$last : "$$CURRENT"} 
    } 
} 

이 확인 사실과 모든 ID에 대한 마지막 데이터를 나를 수 있습니다.

하지만 그 후에 데이터가 필요합니다. ok false에 대해이를 수행하는 간단한 확장 가능한 방법이 있습니까 ??

나는 집계에 foreach는 기능을 사용하려하지만 난 오류

TypeError: db.getCollection(...).aggregate(...).foreach is not a function

그래서 그때 모르는 얻을한다면 ... 그렇게도 가능하다?

답변

1

는 당신이를 ForEach의 매개 변수로 함수를 통과하지 못한 생각 : 그런 집계에 관한

db.getCollection(...).aggregate(...).ForEach(function(myDoc) { 
         print(myDoc.ts); 
         }); 

, 나는이 가능 모르겠습니다. 문서는 가상 시퀀스에 의해 다소 링크되어 있습니다. 다음과 같이 처리합니다 :

  • 날짜와 ID로 정렬 된 쿼리로 커서를 만듭니다. 를 ForEach와
  • 으로 반복이 (이, 20 개 문서의 순서로 데이터를 가져옵니다 당신은 메모리 (클라이언트 또는 DB)에 전체 컬렉션 결국하지 않습니다)
  • 몇이 문을 확인하는 경우 시퀀스가 참/거짓이면 마지막 거짓 시퀀스의 첫 번째 발생을 인쇄합니다.