programing

MongoDB 및 Nodejs를 사용한 날짜 삽입 및 쿼리

jooyons 2023. 5. 25. 21:58
반응형

MongoDB 및 Nodejs를 사용한 날짜 삽입 및 쿼리

mongodb와 nodejs에서 날짜별로 기록을 찾는 데 도움이 필요합니다.

다음과 같이 스크레이핑 스크립트에서 json 개체에 날짜를 추가합니다.

jsonObj.last_updated = new Date();

이 개체가 mongodb에 삽입되었습니다.다음과 같이 볼 수 있습니다.

 "last_updated" : "2014-01-22T14:56:59.301Z"

그런 다음 nodejs 스크립트에서 findOne()을 수행합니다.

 var jObj = JSON.parse(line.toString());

 collection.findOne(jObj,function(err, doc) {
   if (doc){
     console.log(doc._id);
   } else  {
     console.log('not found');
   }
 });

개체를 찾을 수 없습니다.개체에서 last_update된 필드를 제거하면 해당 필드가 발견되므로 문제가 발생한 위치가 확실합니다.

필드를 다음과 같이 분리하는 경우:

collection.findOne({last_updated: '2014-01-22T14:56:59.301Z'},function(err, doc) {
  if (doc){
    console.log(doc._id);
  } else  {
    console.log('not found');
  }
});

아무 것도 돌아오지 않습니다.내가 뭘 잘못하고 있는 거지?

날짜 문자열이 아닌 날짜 개체를 전달해야 합니다.

collection.findOne({last_updated: new Date('2014-01-22T14:56:59.301Z')},function(err, doc) {

MongoDB 드라이버는 그것을 다음으로 변환할 것입니다.ISODate:

{ 
   "_id" : ObjectId("52dfe0c469631792dba51770"), 
   "last_updated" : ISODate('2014-01-22T14:56:59.301Z') 
}

다음 질문을 확인하십시오.

명확히 하기 위해서요.알아야 할 중요한 것은 다음과 같습니다.

  • 예, 당신은 Javascript Date 객체를 전달해야 합니다.
  • 예, isodate friendly여야 합니다.
  • 예, 제 경험에 비추어 볼 때 ISO로 날짜를 조정해야 합니다.
  • 예, 날짜 작업은 일반적으로 항상 지루한 프로세스이며, 몽고도 예외는 아닙니다.

이것은 Mongo가 정확하게 처리할 수 있도록 약간의 날짜 조작을 하는 코드의 작동하는 부분입니다.이 예에서는 mongoose 모듈을 사용하고 있으며 date 속성이 myDate 매개 변수로 지정된 날짜보다 작은(즉, 이전) 행에 대한 결과를 원합니다.

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})

최근에 같은 문제가 발생했는데 추가 정보를 추가하고 싶습니다.

다음 두 가지 방법으로 날짜를 삽입할 수 있습니다.

  1. nodejs 서버 측에서 작성됨(예: Express에서 작성됨)JS 스크립트)

예: 새 개체를 삽입하고 타임스탬프를 기록합니다.

db.collection('mycollection').findOneAndUpdate({'name': req.body.name}, {
  // only "update" if it's an insert, meaning name is not found
  $setOnInsert: {
    'name': req.body.name,
    'date_added': new Date()
  }
}, { 
  upsert: true
}, (err, result) => {
  if(err) return res.send(err);
  res.send(result);
});
  1. JS에서 클라이언트 측에서 생성된 후 POST 요청을 통해 JSON 객체의 REST API를 사용하여 유선으로 전송됩니다.

예:

// Send POST Request here
fetch('addDate', {
  method: 'post',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    'date_added':  new Date()
  })
})

1. 및 2.의 경우. 다음을 사용하여 날짜를 만듭니다.new Date('2014-01-22T14:56:59.301Z')위의 답변에 설명된 대로 기능합니다.차이점은 MongoClient 패키지를 사용하여 서버 측에서 1.과 같이 수행하면 다음과 같이 저장됩니다.ISODate('2014-01-22T14:56:59.301Z')MongoDB에서.클라이언트 측에서 2와 같이 수행하면 문자열로 저장됩니다.'2014-01-22T14:56:59.301Z'MongoDB에서.

사용해야 하는 ISODate 개체를 쿼리하려면new Date('2014-01-22T14:56:59.301Z')또는ISODate('2014-01-22T14:56:59.301Z')문자열을 쿼리하려면 문자열만 사용합니다.'2014-01-22T14:56:59.301Z'

다음은 mongo 셸을 사용하는 몇 가지 쿼리 샘플입니다.

문자열로 저장된 날짜:

db.mycollection.findOne({date_added {$gte:'2018-06-22T00:07:53.688Z'}})

반환됩니다.

{
  "_id" : ObjectId("5b2c3dd90078ce3cd484ef21"),
  "name" : "alfons",
  "date_added" : "2018-06-22T00:07:53.688Z"
}

ISO 날짜로 저장된 날짜:

db.mycollection.findOne({date_added: {$lte: ISODate('2018-06-26T23:24:37.023Z')}})

또는 "새 날짜"를 대신 사용합니다.

db.mycollection.findOne({date_added: {$lte: new Date('2018-06-26T23:24:37.023Z')}

다음이 반환됩니다.

{
  "_id" : ObjectId("5b2bb21e1954b104e61ff735"),
  "name" : "ceasar",
  "date_added" : ISODate("2018-06-21T14:11:41.323Z")
}

스키마 및 값의 기본 키를 Date.now()에 추가합니다.

타임스탬프 데이터를 사용하여 쿼리하는 경우.EG : "createdAt" : "2021-07-12T 16:06:34.949Z"

const start  = req.params.id; //2021-07-12
const data = await Model.find({
            "createdAt": {
              '$gte': `${start}T00:00:00.000Z`,
              '$lt': `${start}T23:59:59.999Z`
            }
          });
console.log(data);

이 경우 특정 날짜의 데이터를 보여줍니다."2021-07-12"

언급URL : https://stackoverflow.com/questions/21286599/inserting-and-querying-date-with-mongodb-and-nodejs

반응형