[node.js] MongoDB / Mongoose 특정 날짜에 질의 하시겠습니까?



Answers

Moment.js 사용하는 사람들을 위해

var moment = require('moment')

var today = moment().startOf('day')
var tomorrow = moment(today).add(1, 'days')

MyModel.find({
  createdAt: {
    $gte: today.toDate(),
    $lt: tomorrow.toDate()
  }
})

중요 : 모든 순간은 변경 가능합니다 !

tomorrow = today.add(1, 'days')today 변경되기 때문에 작동하지 않습니다. moment(today) 부르는 moment(today) today 암묵적으로 복제함으로써 그 문제를 해결합니다.

Question

특정 날짜를 쿼리 할 수 ​​있습니까?

나는 mongo Cookbook에서 우리가 범위를 위해 그것을 할 수 있다는 것을 알았다.

db.posts.find({"created_on": {"$gte": start, "$lt": end}})

그러나 특정 날짜에 가능합니까? 작동하지 않습니다.

db.posts.find({"created_on": new Date(2012, 7, 14) })



특정 날짜의 결과를 얻기 위해 API 메소드에 대해 다음과 같은 접근 방식을 사용할 수 있습니다.

# [HTTP GET]
getMeals: (req, res) ->
  options = {}
  # eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET)
  if req.query.date?
    date = new Date req.query.date
    date.setHours 0, 0, 0, 0
    endDate = new Date date
    endDate.setHours 23, 59, 59, 59
    options.date =
      $lt: endDate
      $gte: date

  Meal.find options, (err, meals) ->
      if err or not meals
        handleError err, meals, res
      else
        res.json createJSON meals, null, 'meals'



우리는 데이터베이스에 중복 된 데이터와 관련된 문제가있었습니다. 날짜 필드에는 여러 값이있어서 1을 가져야했습니다. 참조 용으로 문제를 해결하는 방법을 추가한다고 생각했습니다.

우리는 숫자 "값"필드와 날짜 "날짜"필드가있는 "데이터"라는 콜렉션을 가지고 있습니다. 우리는 멱등수라고 생각했던 프로세스를 가졌지 만 두 번째 실행에서 하루에 2 x 값을 추가했습니다.

{ "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")}
{ "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")}

우리는 2 레코드 중 1 개만 필요하므로 자바 스크립트를 사용하여 db를 정리해야합니다. 우리의 초기 접근 방식은 결과를 반복하고 오전 6 시부 터 오전 11 시까 지 모든 필드를 제거하는 것이 었습니다 (모든 중복은 아침에있었습니다). 그러나 구현 중에는 변경이있었습니다. 다음은 스크립트를 수정하는 데 사용 된 스크립트입니다.

var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
    var datum = data.next();
    var rdate = datum.date;
    // instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better...
    if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") {
       if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) {
           print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date);
       }
       else {
           print("Removing " + datum._id);
           db.data.remove({ "_id": datum._id});
       }
    }
    else {
       found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value;
    }
}

mongo thedatabase fixer_script.js 하여 실행했습니다.




Links