web-dev-qa-db-fra.com

Insérer un champ avec la collection $ currentDate to MongoDB dans Meteor

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 

  • Les champs ne peuvent pas commencer par les opérateurs $ ou, pour autant que je sache, les accolades {}.
  • 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?
  • Pourquoi/quand $currentDate est-il meilleur que new Date
  • Une bonne chose, si vous utilisez Moment.js esp, est que $ currentDate est entré au format ISO 8601.
  • Est-ce que la réponse est de faire une sorte d'upert dès le début? Si oui, cela pourrait-il avoir des conséquences inattendues?
15
Mallory-Erik

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 que new 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. 

21
styvane

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. 

4
Ludek

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 

0
Monika Mathur

$ 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.
0
Bhumi Singhal