it-swarm.com.de

füge created_at und updated_at Felder zu Mungoschemata hinzu

Gibt es eine Möglichkeit, created_at- und updated_at-Felder zu einem Mungoschema hinzuzufügen, ohne sie bei jedem Aufruf von MyModel () neu übergeben zu müssen?

Das Feld created_at ist ein Datum und wird nur beim Erstellen eines Dokuments hinzugefügt. Das Feld updated_at wird bei jedem Aufruf von save () für ein Dokument mit einem neuen Datum aktualisiert.

Ich habe dies in meinem Schema versucht, aber das Feld wird nur angezeigt, wenn ich es ausdrücklich hinzufüge:

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

Wenn Sie update() oder findOneAndUpdate() verwenden

mit {upsert: true} Möglichkeit

du kannst $setOnInsert

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

UPDATE: (5 Jahre später)

Hinweis: Wenn Sie sich für die Verwendung von Kappa Architecture entscheiden ( Event Sourcing + CQRS), dann brauchen Sie überhaupt kein Aktualisierungsdatum. Da es sich bei Ihren Daten um ein unveränderliches Ereignisprotokoll handelt, das nur anhängbar ist, benötigen Sie immer nur das Erstellungsdatum des Ereignisses. Ähnlich der unten beschriebenen Lambda-Architektur. Dann ist Ihr Anwendungsstatus eine Projektion des Ereignisprotokolls (abgeleitete Daten). Wenn Sie ein nachfolgendes Ereignis zu einer vorhandenen Entität erhalten, verwenden Sie das Erstellungsdatum dieses Ereignisses als Aktualisierungsdatum für Ihre Entität. Dies ist eine häufig angewandte (und häufig missverstandene) Praxis in Miceroservice-Systemen.

UPDATE: (4 Jahre später)

Wenn Sie ObjectId als _id - Feld verwenden (was normalerweise der Fall ist), müssen Sie nur Folgendes tun:

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

Überprüfen Sie in meiner ursprünglichen Antwort unten, wie Sie den erstellten Zeitstempel aus dem Feld _id Abrufen können. Wenn Sie IDs von einem externen System verwenden müssen, überprüfen Sie die Antwort von Roman Rhrn Nesterov.

UPDATE: (2,5 Jahre später)

Sie können jetzt die Option # timestamps mit der Mungoversion> = 4.0 verwenden.

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

Wenn Sie Zeitstempel setzen, weist Mungo Ihrem Schema die Felder createdAt und updatedAt zu. Der zugewiesene Typ ist Date.

Sie können auch die Namen der Zeitstempeldateien angeben:

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

Hinweis: Wenn Sie an einer großen Anwendung mit kritischen Daten arbeiten, sollten Sie die Aktualisierung Ihrer Dokumente überdenken. Ich würde Ihnen raten, mit unveränderlichen, nur anhängbaren Daten ( Lambda-Architektur ) zu arbeiten. Dies bedeutet, dass Sie immer nur Einfügungen zulassen. Aktualisierungen und Löschungen sollten nicht erlaubt sein! Wenn Sie einen Datensatz "löschen" möchten, können Sie leicht eine neue Version des Dokuments mit einigen timestamp/version abgelegt und dann ein Feld deleted auf true gesetzt. Wenn Sie ein Dokument aktualisieren möchten, erstellen Sie ein neues Dokument mit den entsprechenden aktualisierten Feldern und den übrigen Feldern, die kopiert wurden. Um dieses Dokument abzufragen, erhalten Sie das Dokument mit dem neuesten Zeitstempel oder der höchsten Version nicht "gelöscht" (das Feld deleted ist undefiniert oder falsch`).

Durch die Unveränderlichkeit der Daten wird sichergestellt, dass Ihre Daten debuggbar sind. Sie können den Verlauf jedes Dokuments verfolgen. Sie können auch auf die vorherige Version eines Dokuments zurücksetzen, wenn ein Fehler auftritt. Wenn Sie sich für eine solche Architektur entscheiden, ist ObjectId.getTimestamp() alles, was Sie brauchen, und es ist nicht mungoabhängig.


URSPRÜNGLICHE ANTWORT:

Wenn Sie ObjectId als Identitätsfeld verwenden, benötigen Sie kein created_at - Feld. ObjectIds haben eine Methode namens getTimestamp().

 ObjectId ("507c7f79bcf86cd7994f6c0e"). GetTimestamp () 

Dies gibt die folgende Ausgabe zurück:

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

Weitere Informationen hier Wie extrahiere ich das Erstellungsdatum aus einer Mongo ObjectID

Um das Feld updated_at Hinzuzufügen, müssen Sie Folgendes verwenden:

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();
});
228
Pavel Nikolov

Dies ist, was ich getan habe:

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();
});
130
chovy

Verwenden Sie die integrierte Option timestamps für Ihr Schema.

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

Dadurch werden Ihrem Schema automatisch die Felder createdAt und updatedAt hinzugefügt.

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

103
mcompeau

Ab Mongoose 4.0 können Sie jetzt eine Zeitstempeloption für das Schema festlegen, damit Mongoose dies für Sie erledigt:

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

Sie können den Namen der verwendeten Felder folgendermaßen ändern:

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

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

72
Binarytales

Fügen Sie so timestamps zu Ihrem Schema hinzu, dann werden createdAt und updatedAt automatisch für Sie generiert

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

enter image description here
Sie können auch createdAt -> created_at durch

timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }
24
Phan Van Linh

Dies ist, wie ich erreicht habe, erstellt und aktualisiert.

In meinem Schema habe ich das so erstellt und aktualisiert:

 /**
 * Article Schema 
 */
 Var ArticleSchema = new Schema ({
 erstellt: {
 Typ: Datum, 
 Standard: Datum. Jetzt 
}, 
 aktualisiert: {
 Typ: Datum, 
 default: Date.now 
},
 title: {
 type: String, 
 default: '', 
 trim: true, 
 required: 'Title darf nicht leer sein' 
}, 
 Inhalt: {
 Typ: Zeichenfolge, 
 Standard: '', 
 Beschnitt: wahr 
}, 
 user: {
 type: Schema.ObjectId, 
 ref: 'User' 
} 
}); 

Dann habe ich in meiner Artikelaktualisierungsmethode im Artikelcontroller Folgendes hinzugefügt:

/** 
 * Aktualisiere einen Artikel 
 */
 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); 
} 
}); 
}; 

Die fett gedruckten Abschnitte sind die Teile von Interesse.

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

ItemSchema.set('timestamps', true); // this will add createdAt and updatedAt timestamps

Dokumente: https://mongoosejs.com/docs/guide.html#timestamps

5
Nikolay_R

Sie können das timestamp Plugin von mongoose-troop Verwenden, um dieses Verhalten zu jedem Schema hinzuzufügen.

4
JohnnyHK

Sie können dieses Plugin sehr einfach verwenden. Aus den Dokumenten:

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

Wenn Sie möchten, können Sie auch den Namen der Felder festlegen:

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

wir können dies auch erreichen, indem wir Schema-Plugin verwenden.

Im helpers/schemaPlugin.js Datei

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);
};

und in models/ItemSchema.js Datei:

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);
1
Shaishab Roy

Meine Mungoversion ist 4.10.2

Scheint nur der Haken findOneAndUpdate ist Arbeit

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

Verwenden Sie eine Funktion, um den berechneten Standardwert zurückzugeben:

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();
});
0
orourkedd

Verwenden Sie machinepack-datetime, um das Datum und die Uhrzeit zu formatieren.

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
});

Maschinenpaket ist mit klarer API im Gegensatz zu Express oder allgemeiner Javascript-Welt großartig.

0
Piyush P
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 }
});

Jetzt können Sie dies verwenden, sodass diese Option nicht in jeder Tabelle enthalten sein muss

0
Raghu

Das mache ich eigentlich hinten

Wenn alles gut geht mit der Aktualisierung:

 // 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
      });
    });
0
shukar