복붙노트

[MONGODB] MongoDB의 쿼리 특정 달 | 년되지 날짜

MONGODB

MongoDB의 쿼리 특정 달 | 년되지 날짜

내가 MongoDB를의 특정 월 쿼리 수있는 방법이 아닌 날짜 범위, 나는 이번 달에 대한 고객의 생일의 목록을 만들기 위해 한 달해야합니다.

SQL에서 그런 일이 될 것입니다 :

SELECT * FROM customer WHERE MONTH(bday)='09'

지금은 MongoDB의에서 그 번역 할 필요가있다. 참고 : 내 날짜가 이미 MongoDate 유형에 저장됩니다, 나는 쉽게 전에 작업하는 것이 사고를 사용하지만, 지금은이 간단한 일을하는 방법을 쉽게 찾을 수 없습니다.

해결법

  1. ==============================

    1.당신은 $ 월 투영 오퍼레이터와 그 사용하여 집계 할 수 있습니다 :

    당신은 $ 월 투영 오퍼레이터와 그 사용하여 집계 할 수 있습니다 :

    db.customer.aggregate([
      {$project: {name: 1, month: {$month: '$bday'}}},
      {$match: {month: 9}}
    ]);
    
  2. ==============================

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

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

    4.당신이 효율성에 대해 우려하는 경우, 각 문서 내에서 별도의 필드에 달 데이터를 저장 할 수 있습니다.

    당신이 효율성에 대해 우려하는 경우, 각 문서 내에서 별도의 필드에 달 데이터를 저장 할 수 있습니다.

  5. from https://stackoverflow.com/questions/18907566/mongodb-query-specific-monthyear-not-date by cc-by-sa and MIT license