복붙노트

[MONGODB] created_at를 추가하고 필드 updated_at 스키마를 몽구스하기

MONGODB

created_at를 추가하고 필드 updated_at 스키마를 몽구스하기

매번 새로운 MyModel에 전달할 필요없이, created_at과 몽구스 스키마 필드 updated_at 추가 할 수있는 방법이 있나요 ()가 호출?

created_at 필드는 일이 될 것입니다 및 문서가 생성 될 때에만 덧붙였다. updated_at 필드는 문서에 호출 될 때마다 저장 () 새로운 날짜로 업데이트됩니다.

내 스키마에서 이것을 시도했다,하지만 난 명시 적으로 추가하지 않는 분야는 표시되지 않습니다 :

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

해결법

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

    1.() 사용 업데이트 () 또는 findOneAndUpdate하는 경우

    () 사용 업데이트 () 또는 findOneAndUpdate하는 경우

    옵션 : {사실 upsert}와

    당신은 $ setOnInsert을 사용할 수 있습니다

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

    2.UPDATE : (5 년 이상)

    UPDATE : (5 년 이상)

    UPDATE : (4 년 후)

    당신이 (보통의 경우 인) 당신의 _id 필드로 ObjectId가를 사용하는 경우, 당신이 할 필요가있다 :

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

    _id 필드에서 생성 된 타임 스탬프를 얻는 방법에 아래에있는 내 원래의 대답을 확인하십시오. 외부 시스템에서 ID를 사용해야하는 경우, 다음 로마 Rhrn 네 스테 로프의 답변을 확인합니다.

    UPDATE : (2.5 년 이상)

    이제 몽구스 버전> = 4.0로 #timestamps 옵션을 사용할 수 있습니다.

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

    세트 타임 스탬프 경우, 스키마에 대한 몽구스 양수인 createdAt 및 updatedAt 필드는 할당 된 유형은 날짜입니다.

    또한 소인 필드의 이름을 지정할 수 있습니다 :

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

    ORIGINAL 답변 :

    당신이 당신의 신원 필드로 ObjectId가를 사용하는 경우는 created_at 필드가 필요하지 않습니다. 하며 Object가 getTimestamp라는 방법을 ().

    ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()
    

    이것은 다음과 같은 출력을 반환합니다 :

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

    나는 몽고 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();
    });
    
  3. ==============================

    3.이것은 내가하고 결국 무엇을 :

    이것은 내가하고 결국 무엇을 :

    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();
    });
    
  4. ==============================

    4.당신의 스키마에 내장 된 타임 스탬프 옵션을 사용합니다.

    당신의 스키마에 내장 된 타임 스탬프 옵션을 사용합니다.

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

    이것은 자동으로 스키마에 createdAt 및 updatedAt 필드를 추가합니다.

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

  5. ==============================

    5.몽구스 4.0으로 이제 몽구스가 당신을 위해이 문제를 해결할 가지고있는 스키마에 타임 스탬프 옵션을 설정할 수 있습니다 :

    몽구스 4.0으로 이제 몽구스가 당신을 위해이 문제를 해결할 가지고있는 스키마에 타임 스탬프 옵션을 설정할 수 있습니다 :

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

    당신은 너무처럼 사용할 필드의 이름을 변경할 수 있습니다 :

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

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

  6. ==============================

    6.다음 createdAt 및 updatedAt 당신을 위해 자동 생성이 같은 스키마에 타임 스탬프를 추가

    다음 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' }
    
  7. ==============================

    7.이것은 내가 만든 업데이트 한 달성하는 방법이다.

    이것은 내가 만든 업데이트 한 달성하는 방법이다.

    내 스키마 내부 내가 작성과 같이 업데이트 추가 :

       /**
         * Article Schema
         */
        var ArticleSchema = new Schema({
            created: {
                type: Date,
                default: Date.now
            },
            updated: {
                type: Date,
                default: Date.now
            },
            title: {
                type: String,
                default: '',
                trim: true,
                required: 'Title cannot be blank'
            },
            content: {
                type: String,
                default: '',
                trim: true
            },
            user: {
                type: Schema.ObjectId,
                ref: 'User'
            }
        });
    

    그런 다음 문서 컨트롤러 안에 내 문서 업데이트 방법에 내가 추가 :

    /**
         * Update a article
         */
        exports.update = function(req, res) {
            var article = req.article;
    
            article = _.extend(article, req.body);
            article.set("updated", Date.now());
    
            article.save(function(err) {
                if (err) {
                    return res.status(400).send({
                        message: errorHandler.getErrorMessage(err)
                    });
                } else {
                    res.json(article);
                }
            });
        };
    

    굵은 부분은 관심있는 부분입니다.

  8. ==============================

    8.

    var ItemSchema = new Schema({
        name : { type: String, required: true, trim: true }
    });
    
    ItemSchema.set('timestamps', true); // this will add createdAt and updatedAt timestamps
    

    문서 도구 : https://mongoosejs.com/docs/guide.html#timestamps

  9. ==============================

    9.당신은 어떤 스키마에이 동작을 추가 할 수 몽구스 - 병력의 타임 스탬프 플러그인을 사용할 수 있습니다.

    당신은 어떤 스키마에이 동작을 추가 할 수 몽구스 - 병력의 타임 스탬프 플러그인을 사용할 수 있습니다.

  10. ==============================

    10.당신은 아주 쉽게이 플러그인을 사용할 수 있습니다. 워드 프로세서 :

    당신은 아주 쉽게이 플러그인을 사용할 수 있습니다. 워드 프로세서 :

    var timestamps = require('mongoose-timestamp');
    var UserSchema = new Schema({
        username: String
    });
    UserSchema.plugin(timestamps);
    mongoose.model('User', UserSchema);
    var User = mongoose.model('User', UserSchema)
    

    원하는 경우 또한 필드의 이름을 설정 :

    mongoose.plugin(timestamps,  {
      createdAt: 'created_at', 
      updatedAt: 'updated_at'
    });
    
  11. ==============================

    11.우리는 또한 스키마 플러그인을 사용하여이를 달성 할 수있다.

    우리는 또한 스키마 플러그인을 사용하여이를 달성 할 수있다.

    도우미에서 / schemaPlugin.js 파일

    module.exports = function(schema) {
    
      var updateDate = function(next){
        var self = this;
        self.updated_at = new Date();
        if ( !self.created_at ) {
          self.created_at = now;
        }
        next()
      };
      // update date for bellow 4 methods
      schema.pre('save', updateDate)
        .pre('update', updateDate)
        .pre('findOneAndUpdate', updateDate)
        .pre('findByIdAndUpdate', updateDate);
    };
    

    및 모델 / ItemSchema.js 파일 :

    var mongoose = require('mongoose'),
      Schema   = mongoose.Schema,
      SchemaPlugin = require('../helpers/schemaPlugin');
    
    var ItemSchema = new Schema({
      name    : { type: String, required: true, trim: true },
      created_at    : { type: Date },
      updated_at    : { type: Date }
    });
    ItemSchema.plugin(SchemaPlugin);
    module.exports = mongoose.model('Item', ItemSchema);
    
  12. ==============================

    12.내 몽구스 버전은 4.10.2입니다

    내 몽구스 버전은 4.10.2입니다

    findOneAndUpdate 작업은 후크 것 같다

    ModelSchema.pre('findOneAndUpdate', function(next) {
      // console.log('pre findOneAndUpdate ....')
      this.update({},{ $set: { updatedAt: new Date() } });
      next()
    })
    
  13. ==============================

    13.계산 된 기본 값을 반환하는 함수를 사용합니다 :

    계산 된 기본 값을 반환하는 함수를 사용합니다 :

    var ItemSchema = new Schema({
        name: {
          type: String,
          required: true,
          trim: true
        },
        created_at: {
          type: Date,
          default: function(){
            return Date.now();
          }
        },
        updated_at: {
          type: Date,
          default: function(){
            return Date.now();
          }
        }
    });
    
    ItemSchema.pre('save', function(done) {
      this.updated_at = Date.now();
      done();
    });
    
  14. ==============================

    14.

    const mongoose = require('mongoose');
    const config = require('config');
    const util = require('util');
    
    const Schema = mongoose.Schema;
    const BaseSchema = function(obj, options) {
      if (typeof(options) == 'undefined') {
        options = {};
      }
      if (typeof(options['timestamps']) == 'undefined') {
        options['timestamps'] = true;
      }
    
      Schema.apply(this, [obj, options]);
    };
    util.inherits(BaseSchema, Schema);
    
    var testSchema = new BaseSchema({
      jsonObject: { type: Object }
      , stringVar : { type: String }
    });
    

    모든 테이블에서이 옵션을 포함 할 필요가 없도록 지금 당신은이를 사용할 수 있습니다

  15. ==============================

    15.사실 난 뒤에 이렇게

    사실 난 뒤에 이렇게

    모든 업데이트와 잘 어울리는 경우 :

     // All ifs passed successfully. Moving on the Model.save
        Model.lastUpdated = Date.now(); // <------ Now!
        Model.save(function (err, result) {
          if (err) {
            return res.status(500).json({
              title: 'An error occured',
              error: err
            });
          }
          res.status(200).json({
            message: 'Model Updated',
            obj: result
          });
        });
    
  16. ==============================

    16.사용 machinepack - 날짜는 날짜를 포맷합니다.

    사용 machinepack - 날짜는 날짜를 포맷합니다.

    tutorialSchema.virtual('createdOn').get(function () {
        const DateTime = require('machinepack-datetime');
        let timeAgoString = "";
        try {
            timeAgoString = DateTime.timeFrom({
                toWhen: DateTime.parse({
                    datetime: this.createdAt
                }).execSync(),
                fromWhen: new Date().getTime()
            }).execSync();
        } catch(err) {
            console.log('error getting createdon', err);
        }
        return timeAgoString; // a second ago
    });
    

    기계 팩은 명시 적 또는 일반 자바 스크립트의 세계와는 달리 명확한 API에 아주 좋습니다.

  17. ==============================

    17.당신은 미들웨어 및 virtuals에 사용할 수 있습니다. 여기 updated_at 필드에 대한 예입니다 :

    당신은 미들웨어 및 virtuals에 사용할 수 있습니다. 여기 updated_at 필드에 대한 예입니다 :

    ItemSchema.virtual('name').set(function (name) {
      this.updated_at = Date.now;
      return name;
    });
    
  18. from https://stackoverflow.com/questions/12669615/add-created-at-and-updated-at-fields-to-mongoose-schemas by cc-by-sa and MIT license