sql >> Database teknologi >  >> NoSQL >> MongoDB

tilføj felterne create_at og updated_at til mongoose-skemaer

OPDATERING: (5 år senere)

Bemærk: Hvis du beslutter dig for at bruge Kappa Architecture (Event Sourcing + CQRS ), så behøver du slet ikke opdateret dato. Da dine data er en uforanderlig hændelseslog, der kun kan tilføjes, behøver du kun dato for oprettelse af hændelser. Svarende til Lambda-arkitekturen , beskrevet nedenfor. Så er din applikationstilstand en projektion af hændelsesloggen (afledte data). Hvis du modtager en efterfølgende begivenhed om eksisterende enhed, skal du bruge begivenhedens oprettelsesdato som opdateret dato for din enhed. Dette er en almindeligt brugt (og almindeligvis misforstået) praksis i miceroservice-systemer.

OPDATERING: (4 år senere)

Hvis du bruger ObjectId som dit _id felt (hvilket normalt er tilfældet), så er alt hvad du skal gøre:

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

Tjek mit originale svar nedenfor om, hvordan du får det oprettede tidsstempel fra _id felt.Hvis du skal bruge ID'er fra eksternt system, så tjek Roman Rhrn Nesterovs svar.

OPDATERING: (2,5 år senere)

Du kan nu bruge #timestamps muligheden med mongoose version>=4.0.

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

Hvis tidsstempler angives, tildeler mongoose createdAt og updatedAt felter til dit skema, er den tildelte type Dato .

Du kan også angive tidsstemplets navne:

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

Bemærk: Hvis du arbejder på en stor applikation med kritiske data, bør du genoverveje at opdatere dine dokumenter. Jeg vil råde dig til at arbejde med uforanderlige data, der kun kan tilføjes (lambda-arkitektur). Det betyder, at du kun tillader indsatser. Opdateringer og sletninger bør ikke tillades! Hvis du gerne vil "slette" en post, kan du nemt indsætte en ny version af dokumentet med et tidsstempel /version arkiveret, og indstil derefter en deleted felt til true . På samme måde, hvis du vil opdatere et dokument – opretter du et nyt med de relevante felter opdateret og resten af ​​felterne kopieret over. For at forespørge dette dokument vil du derefter få det med det nyeste tidsstempel eller den højeste version, som ikke er "slettet" (den slettede felt er udefineret eller falsk`).

Data-uforanderlighed sikrer, at dine data kan fejlfindes - du kan spore historien for hvert dokument. Du kan også rulle tilbage til tidligere version af et dokument, hvis noget går galt. Hvis du går med en sådan arkitektur ObjectId.getTimestamp() er alt hvad du behøver, og det er ikke Mongoose-afhængigt.

ORIGINAL SVAR:

Hvis du bruger ObjectId som dit identitetsfelt, behøver du ikke created_at Mark. ObjectId'er har en metode kaldet getTimestamp() .

ObjectId("507c7f79bcf86cd7994f6c0e").getTimestamp()

Dette vil returnere følgende output:

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

Mere info her Hvordan trækker jeg den oprettede dato ud af et Mongo ObjectID

For at tilføje updated_at arkiveret skal du bruge dette:

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


  1. Sådan administreres dokumenter i MongoDB

  2. Push og sæt operationer i samme MongoDB-opdatering

  3. Hvordan får man junit-testene til at bruge den indlejrede mongoDB i en springboot-applikation?

  4. AOF og RDB sikkerhedskopier i redis