[node.js] 몽구스 스키마에 created_at 및 updated_at 필드 추가

new MyModel ()이 호출 될 때마다 생성하지 않고 created_at 및 updated_at 필드를 몽구스 스키마에 추가하는 방법이 있습니까?

created_at 필드는 날짜이며 문서를 만들 때만 추가됩니다. updated_at 필드는 문서에서 save ()가 호출 될 때마다 새로운 날짜로 업데이트됩니다.

내 스키마에서 이것을 시도했지만 필드를 신속하게 추가하지 않으면 필드가 표시되지 않습니다.

var ItemSchema = new Schema({
    name    : { type: String, required: true, trim: true }
  , created_at    : { type: Date, required: true, default: Date.now }
});



답변

Mongoose 4.0부터는 스키마에서 타임 스탬프 옵션을 설정하여 Mongoose가이를 처리하도록 할 수 있습니다.

var thingSchema = new Schema({..}, { timestamps: true });

다음과 같이 사용 된 필드의 이름을 변경할 수 있습니다.

var thingSchema = new Schema({..}, { timestamps: { createdAt: 'created_at' } });

http://mongoosejs.com/docs/guide.html#timestamps


답변

업데이트 : (5 년 후)

참고 : Kappa Architecture ( Event Sourcing + CQRS ) 를 사용하기로 결정한 경우 업데이트 날짜가 전혀 필요하지 않습니다. 데이터는 변경 불가능한 추가 전용 이벤트 로그이므로 이벤트 작성 날짜 만 있으면됩니다. 아래 설명 된 Lambda 아키텍처 와 유사 합니다. 그런 다음 응용 프로그램 상태는 이벤트 로그 (파생 데이터)의 투영입니다. 기존 엔티티에 대한 후속 이벤트를 수신하면 해당 이벤트의 작성 날짜를 엔티티의 업데이트 날짜로 사용합니다. 이것은 mouseroservice 시스템에서 일반적으로 사용되는 (그리고 일반적으로 오해 된) 연습입니다.

업데이트 : (4 년 후)

필드 ObjectId로 사용 _id하는 경우 (보통 경우) 다음과 같이하면됩니다.

let document = {
  updatedAt: new Date(),
}

_id필드 에서 생성 된 타임 스탬프를 얻는 방법에 대해서는 아래의 원래 답변을 확인하십시오 . 외부 시스템의 ID를 사용해야하는 경우 Roman Rhrn Nesterov의 답변을 확인하십시오.

업데이트 : (2.5 년 후)

몽구스 버전이 4.0 이상인 #timestamps 옵션을 사용할 수 있습니다 .

let ItemSchema = new Schema({
  name: { type: String, required: true, trim: true }
},
{
  timestamps: true
});

타임 스탬프, 몽구스 할당 createdAtupdatedAt필드를 스키마에 설정하면 할당 된 유형은 Date입니다.

타임 스탬프 파일 이름을 지정할 수도 있습니다.

timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }

참고 : 중요한 데이터가있는 큰 응용 프로그램을 작업하는 경우 문서 업데이트를 다시 고려해야합니다. 불변의 추가 전용 데이터 ( 람다 아키텍처 )로 작업하는 것이 좋습니다. 이것이 의미하는 것은 삽입물 만 허용한다는 것입니다. 업데이트 및 삭제는 허용되지 않아야합니다! 레코드를 “삭제”하려면 일부 timestamp/ version
파일이 포함 된 새 버전의 문서를 쉽게 삽입 한 다음 deleted필드를 로 설정하면 됩니다 true. 마찬가지로 문서를 업데이트하려는 경우 적절한 필드가 업데이트되고 나머지 필드가 복사 된 새 문서를 만든 다음이 문서를 쿼리하려면 최신 타임 스탬프가있는 문서 또는 최신 버전의 문서를 가져옵니다. “삭제되지 않음”(deleted 필드가 정의되지 않았거나 false입니다.).

데이터 불변성으로 데이터를 디버깅 할 수 있습니다. 모든 문서의 기록을 추적 할 수 있습니다. 문제가 발생하면 이전 버전의 문서로 롤백 할 수도 있습니다. 이러한 아키텍처 ObjectId.getTimestamp()를 사용하면 필요한 모든 것이 있으며 몽구스에 의존하지 않습니다.


원래 답변 :

ID 필드로 ObjectId를 사용하는 경우 필드가 필요하지 않습니다 created_at. ObjectId에는라는 메소드가 getTimestamp()있습니다.

ObjectId ( "507c7f79bcf86cd7994f6c0e"). getTimestamp ()

다음과 같은 출력이 반환됩니다.

ISODate ( "2012-10-15T21 : 26 : 17Z")

자세한 정보는 여기 에서 Mongo ObjectID에서 생성 된 날짜를 추출하는 방법

파일을 추가 updated_at하려면 다음을 사용해야합니다.

var ArticleSchema = new Schema({
  updated_at: { type: Date }
  // rest of the fields go here
});

ArticleSchema.pre('save', function(next) {
  this.updated_at = Date.now();
  next();
});


답변

이것이 내가 한 일입니다.

var ItemSchema = new Schema({
    name    : { type: String, required: true, trim: true }
  , created_at    : { type: Date }
  , updated_at    : { type: Date }
});


ItemSchema.pre('save', function(next){
  now = new Date();
  this.updated_at = now;
  if ( !this.created_at ) {
    this.created_at = now;
  }
  next();
});


답변

timestamps스키마 에 내장 옵션을 사용하십시오.

var ItemSchema = new Schema({
    name: { type: String, required: true, trim: true }
},
{
    timestamps: true
});

그러면 스키마에 자동으로 createdAtupdatedAt필드가 추가됩니다 .

http://mongoosejs.com/docs/guide.html#timestamps


답변

사용하는 경우 update()또는findOneAndUpdate()

{upsert: true}옵션

당신이 사용할 수있는 $setOnInsert

var update = {
  updatedAt: new Date(),
  $setOnInsert: {
    createdAt: new Date()
  }
};


답변

추가 timestamps귀하에게 Schema다음과 같이 createdAt하고 updatedAt당신을 위해 자동 생성

var UserSchema = new Schema({
    email: String,
    views: { type: Number, default: 0 },
    status: Boolean
}, { timestamps: {} });

여기에 이미지 설명을 입력하십시오
또한 당신은에 createdAt -> created_at의해 변경할 수 있습니다

timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }


답변

이것이 내가 만들고 업데이트 한 방법입니다.

내 스키마 안에 다음과 같이 생성하고 업데이트했습니다.

   / **
     * 기사 스키마
     * /
    var ArticleSchema = 새 스키마 ({
        만들어진: {
            유형 : 날짜,
            기본값 : Date.now
        },
        업데이트 : {
            유형 : 날짜,
            기본값 : Date.now
        },
        제목 : {
            유형 : 문자열,
            기본: '',
            손질 : 참,
            필수 : '제목은 비워 둘 수 없습니다'
        },
        내용 : {
            유형 : 문자열,
            기본: '',
            손질 : 참
        },
        사용자: {
            유형 : Schema.ObjectId,
            심판 : '사용자'
        }
    });

그런 다음 기사 컨트롤러 내의 기사 업데이트 방법에서 다음을 추가했습니다.

/ **
     * 기사 업데이트
     * /
    exports.update = 함수 (요청, 해상도) {
        var article = 요구 사항;

        article = _.extend (문서, 요청 본문);
        article.set ( "updated", Date.now ());

        article.save (function (err) {
            if (err) {
                res.status (400) .send ({
                    메시지 : errorHandler.getErrorMessage (err)
                });
            } else {
                res.json (기사);
            }
        });
    };

굵게 표시된 부분은 관심있는 부분입니다.