2017-05-04 5 views
0

현재 메타 데이터를 사용하여 데이터를 분석하고 있습니다. 집계 쿼리로 쿼리하는 중 문제가 발생했습니다. date1이 date2 이전의 모든 문서를 원했습니다. 난 항상 어떤 결과를 얻는하지있어mongo aggregation framework에서 두 날짜를 비교하는 방법은 무엇입니까?

[{ 
    "$match": { 
    "date1": { 
     "$exists": true 
    } 
    } 
}, { 
    "$project": { 
    "_id": 0, 
    "date1": 1, 
    "date2": 1 
    } 
}, { 
    "$match": { 
    "date1": { 
     "$lt": "$date2" 
    } 
    } 
}] 

(나는 내 ​​결과를 디버깅하는 3 개 필터를 사용, 나중에 1 개 경기 필터에 넣어 수 있어야한다). 쿼리를 도와 줄 수있는 사람은 누구입니까?

편집 :

서류는 다음과 같습니다 : 컬렉션의 50K 문서의 주위에있다

{ 
    _id: ObjectID, 
    date1: ISODate("2016-10-04T08:34:15.041Z"), 
    date2: ISODate("2016-10-05T08:34:15.041Z") 
    ... some more fields that are not interesting for this query 
} 

.

+0

date2 당신은 샘플 문서를 보여 주시겠습니까 포함하지 않는 문서를 제거하기 위해 필요합니까? – notionquest

답변

1

$where을 사용하여 두 날짜 필드를 비교할 수 있습니다.

db.collection.find({ 
    $where : "this.date1 < this.date2"  
}); 

위의 조건을 만족하는 문서가 결과에 표시됩니다. 속성이없는 문서가 date1 또는 date2이면 결과에 표시되지 않습니다. 집계 함수를 사용

: -

$ CMP는 값을 비교하는 데 사용할 수 있습니다. -1은 첫 번째가 두 번째보다 작음을 나타냅니다.

첫 번째 파이프 라인은 모두 date1

db.collection.aggregate([ 
{ 
    "$match": { 
    "date1": { 
     "$exists": true 
    }, 
    "date2": { 
     "$exists": true 
    } 
    } 
}, 
{"$project": { 
     "date1":1, 
     "date2":1, 
     "dateComp": {"$cmp":["$date1","$date2"]} 
    } 
    }, 
    {"$match":{"dateComp": -1}} 

]); 
+0

집계 프레임 워크 (메타베이스 별)에서 집계 프레임 워크를 사용하도록 강요했습니다. $는 집계 프레임 워크에서 중요하지 않습니다. –