Vous ne savez pas comment utiliser $ currentDate lors de l'insertion d'un document dans une collection MongoDB dans Meteor.
Cela ne peut-il être utilisé que dans une mise à jour, pas dans une insertion? Cela semblerait étrange, mais je ne vois pas d’alternative (autre que l’utilisation de new Date
à la place).
Exemple
Stuff.insert({
owner: Meteor.userId(),
createdAt: ..., // how to create this field with $currentDate ?
theStuff: "Some of the good stuff"
})
Notes/Pensées/TL, DR
{}
.$currentDate
est-il meilleur que new Date
? Quel est l'intérêt d'avoir un opérateur qui ne fonctionne qu'avec des mises à jour, si c'est bien le cas?
$currentDate
est un opérateur update vous ne pouvez donc pas l'utiliser avec la méthode collection.insert
. Mais lorsque upsert
est true
, un nouveau document sera créé si aucun document ne correspond aux critères de la requête. Les opérateurs MongoDB ont tendance à suivre la philosophie Unix
Faites une chose et faites-le bien
Chaque opérateur ne doit donc effectuer qu'une seule tâche.
Pourquoi/quand
$currentDate
est-il meilleur quenew Date
?
Premièrement, je voudrais mentionner que new Date
est une instance de date JavaScript.
$currentDate
et new Date
peuvent être utilisés lorsque vous souhaitez mettre à jour la valeur d'un champ avec la date du jour, mais avec new Date
, vous devez utiliser un autre opérateur update pour que cela fonctionne. Par exemple:
Utiliser new Date
db.collection.update({ "name": "bar" }, { "$set": { "date": new Date() }})
Utiliser $currentDate
db.collection.update({ "name": "bar"},
{ "$currentDate": { "date": { "$type": date }}}
)
Contrairement à $currentDate
, new Date
peut être utilisé avec la méthode insert
et la valeur peut être définie sur une valeur particulière si Date
est un appel avec plus d'un argument.
Vous pouvez récupérer l'horodatage à partir de "_id" généré automatiquement lors de l'opération d'insertion.
http://api.mongodb.com/Java/current/org/bson/types/ObjectId.html
Utilisez simplement la méthode ObjectId.getTimestamp ().
La granularité de l'horodatage est en secondes.
Cela deviendra plus simple si vous utiliserez autoValue dans le modèle de collection
createdAt:
type: Date
autoValue: ->
if this.isInsert
return new Date
else if this.isUpsert
return $setOnInsert: new Date
else
this.unset()
Il définira automatiquement la date lors de l'insertion ou de la mise à jour des données
$ currentDate utilisé dans la construction $ update peut être utilisé pour insérer des champs s'ils n'existent pas dans le document.
Citant la documentation pour Mongodb 3.4: Comportement
If the field does not exist, $currentDate adds the field to a document.