Вставить поле с $currentDate в коллекцию MongoDB в Метеор

Не уверен, как использовать $currentDate при вставке документа в коллекцию MongoDB в Meteor.

Можно ли это использовать только в обновлении, а не вставить? Казалось бы странным, но я не вижу альтернативы (кроме использования new Date).

Пример

Stuff.insert({ 
   owner: Meteor.userId(),
   createdAt: ..., // how to create this field with $currentDate ?
   theStuff: "Some of the good stuff"
})

Примечания/Мысли/TL, DR

  • Поля не могут начинаться с $операторов или, насколько мне известно, фигурных скобок {}.
  • Какой смысл иметь оператор, который работает только с обновлениями, если это действительно так?
  • Почему/когда $currentDate лучше, чем new Date?
  • Одна хорошая вещь, если использовать Moment.js esp, заключается в том, что $currentDate вводится в формате ISO 8601.
  • Является ли ответ на какой-то вопрос с самого начала? Если да, может ли это иметь непреднамеренные последствия?

Ответ 1

Какой смысл иметь оператор, который работает только с обновлениями, если это действительно так?

$currentDate является оператором обновления , поэтому вы не можете используйте его с помощью метода collection.insert. Но когда upsert будет true, он создаст новый документ, если документ не будет соответствовать критериям запроса. Операторы MongoDB склонны следовать философии Unix

Сделайте одно дело и сделайте это хорошо

Таким образом, каждый оператор должен выполнять только одну задачу.

Почему/когда $currentDate лучше, чем new Date?

Сначала я хотел бы упомянуть, что new Date является экземпляром даты JavaScript.

$currentDate и new Date могут использоваться, когда вы хотите обновить значение поля до текущей даты, но с помощью new Date вам нужно использовать другой оператор update чтобы он работал. Например:

  • Используя new Date

    db.collection.update({ "name": "bar" }, { "$set": { "date": new Date() }})
    
  • Использование $currentDate

    db.collection.update({ "name": "bar"}, 
        { "$currentDate": { "date": { "$type": date }}}
    )
    

В отличие от $currentDate, new Date можно использовать с помощью метода insert, и значение может быть установлено на конкретное, если Date - вызов с более чем на аргумент.

Ответ 2

Вы можете получить временную метку из автогенерируемого "_id", созданного в операции вставки.

http://api.mongodb.com/java/current/org/bson/types/ObjectId.html

Просто используйте метод: ObjectId.getTimestamp().

Гранулярность отметки времени находится в секундах.

Ответ 3

Это станет проще, если вы будете использовать autoValue в модели коллекции

createdAt:
type: Date
autoValue: ->
  if this.isInsert
    return new Date
  else if this.isUpsert
    return $setOnInsert: new Date
  else
    this.unset()

Он будет автоматически устанавливать дату во время вставки или обновления данных в ней