[MONGODB] MongoDB의 쿼리 특정 달 | 년되지 날짜
MONGODBMongoDB의 쿼리 특정 달 | 년되지 날짜
내가 MongoDB를의 특정 월 쿼리 수있는 방법이 아닌 날짜 범위, 나는 이번 달에 대한 고객의 생일의 목록을 만들기 위해 한 달해야합니다.
SQL에서 그런 일이 될 것입니다 :
SELECT * FROM customer WHERE MONTH(bday)='09'
지금은 MongoDB의에서 그 번역 할 필요가있다. 참고 : 내 날짜가 이미 MongoDate 유형에 저장됩니다, 나는 쉽게 전에 작업하는 것이 사고를 사용하지만, 지금은이 간단한 일을하는 방법을 쉽게 찾을 수 없습니다.
해결법
-
==============================
1.당신은 $ 월 투영 오퍼레이터와 그 사용하여 집계 할 수 있습니다 :
당신은 $ 월 투영 오퍼레이터와 그 사용하여 집계 할 수 있습니다 :
db.customer.aggregate([ {$project: {name: 1, month: {$month: '$bday'}}}, {$match: {month: 9}} ]);
-
==============================
2.MongoDB를 3.6 및 최신으로, 당신은 당신의 발견 () 쿼리에서 $ EXPR 연산자를 사용할 수 있습니다. 이렇게하면 $ 일치하는 단계에서 동일한 문서에서 필드를 비교 쿼리 식을 구축 할 수 있습니다.
MongoDB를 3.6 및 최신으로, 당신은 당신의 발견 () 쿼리에서 $ EXPR 연산자를 사용할 수 있습니다. 이렇게하면 $ 일치하는 단계에서 동일한 문서에서 필드를 비교 쿼리 식을 구축 할 수 있습니다.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
다른 MongoDB를 버전의 경우, 당신은 하나의 파이프 라인에 통합 할 수 있습니다로 $의 편집하다 연산자를 사용하여 집계 파이프 라인, 날짜 필드의 달을 나타내는 필드를 만들 수 $ 프로젝트와를 필터링 $ 일치와 기능을 실행하는 것을 고려 서류 이는 9 월에있는 달의 주어진 조건에 일치합니다.
상기에서, 편집하다 $는 교정을 수행하는 시스템 변수를 생성한다 조건식을 제공하는 수단으로서 $ COND tenary 연산자를 이용한다. $ 콘드의 논리적 표현은 확인합니다 그 경기 후 $ 편집하다이 (가) $$의 KEEP 시스템 변수를 사용하여 문서를 파기을 반환하는 경우 주어진 값을 날짜 연산자 필드의 평등을 위해, 그렇지 않으면 $$ PRUNE을 사용.
다음 파이프 라인을 실행하면 당신이 원하는 결과를 제공해야합니다 :
db.customer.aggregate([ { "$match": { "bday": { "$exists": true } } }, { "$redact": { "$cond": [ { "$eq": [{ "$month": "$bday" }, 9] }, "$$KEEP", "$$PRUNE" ] } } ])
이것은 $ 프로젝트 + $ 일치하는 콤보와 유사하지만 다음 파이프 라인에 들어가는 모든 필드의 나머지 부분을 선택하려면 필요할 것 :
db.customer.aggregate([ { "$match": { "bday": { "$exists": true } } }, { "$project": { "month": { "$month": "$bday" }, "bday": 1, "field1": 1, "field2": 1, ..... } }, { "$match": { "month": 9 } } ])
같은 $ 곳에 또 다른 대안으로, 슬로우 쿼리이기는하지만, 찾기를 사용하여 () 메소드 :
db.customer.find({ "$where": "this.bday.getMonth() === 8" })
-
==============================
3.첫째, 당신은 데이터 타입이 ISODate에 있는지 여부를 확인해야합니다. IF는 없습니다 다음 예와 같은 데이터 형식을 변경할 수 있습니다.
첫째, 당신은 데이터 타입이 ISODate에 있는지 여부를 확인해야합니다. IF는 없습니다 다음 예와 같은 데이터 형식을 변경할 수 있습니다.
db.collectionName.find().forEach(function(each_object_from_collection){each_object_from_collection.your_date_field=new ISODate(each_object_from_collection.your_date_field);db.collectionName.save(each_object_from_collection);})
지금 당신은 두 가지 방법으로 찾을 수 있습니다
db.collectionName.find({ $expr: { $eq: [{ $year: "$your_date_field" }, 2017] }});
또는 집단에 의해
db.collectionName.aggregate([{$project: {field1_you_need_in_result: 1,field12_you_need_in_result: 1,your_year_variable: {$year: '$your_date_field'}, your_month_variable: {$month: '$your_date_field'}}},{$match: {your_year_variable:2017, your_month_variable: 3}}]);
-
==============================
4.당신이 효율성에 대해 우려하는 경우, 각 문서 내에서 별도의 필드에 달 데이터를 저장 할 수 있습니다.
당신이 효율성에 대해 우려하는 경우, 각 문서 내에서 별도의 필드에 달 데이터를 저장 할 수 있습니다.
from https://stackoverflow.com/questions/18907566/mongodb-query-specific-monthyear-not-date by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를 갱신 어레이의 다수의 레코드 [중복] (0) | 2019.12.12 |
---|---|
[MONGODB] 왜 OBJECTID과 _id는 배열에 새 개체를 추가하여 MongoDB의 $ 푸시를 사용하는 경우에 추가됩니다? (0) | 2019.12.12 |
[MONGODB] 콜백없이 몽구스 갱신 (0) | 2019.12.12 |
[MONGODB] NumberLong으로 간단한 정수 사이 MongoDB의 차이? (0) | 2019.12.12 |
[MONGODB] MongoDB를 - 가장 가까운 정수 값을 찾기 문서 (0) | 2019.12.12 |