2015-05-20 3 views
1

У меня проблема с type: Date в SimpleSchema с параметром defaultValue. В mongodb (3.0.1) запись даты имеет время запуска потока метеоров. Ожидаемое поведение - иметь «дату» даты вставки объекта на сервере.Метеор новый Дата() недействителен с mongodb 3.0.1 и автоматической формой/простой схемой

Библиотека/schema.js

Schema.DateCol = new SimpleSchema({ 
    date: { 
    type: Date, 
    defaultValue: new Date() 
    }, 
    dateModified: { 
    type: Date, 
    autoValue: function() { return new Date(); } 
    } 
}); 

клиент/home.html

{{> quickForm id="test" schema="Schema.DateCol" collection="DateCol" type="insert" }} 

в Монго, после установки двух объектов: запуск нити

  • метеора в «Ср май 20 2015 12:28:42 GMT + 0200 (CEST) "
  • оба объекта были вставлены на e минута интервала: первая в «Среда 20 мая 2015 года 12:30:50 GMT + 0200 (CEST)», а вторая - «Среда 20 мая 2015 года 12:31:30 GMT + 0200 (CEST)»
  • поле даты (DefaultValue) как для объекта: "ср 20 мая 2015 12:28:42 GMT + 0200 (CEST)"

объект 1

{ 
    "_id": "PuME9jWwJJiw9diSC", 
    "date": new Date(1432117722634), 
    "dateModified": new Date(1432117850366) 
} 

объект 2:

{ 
    "_id": "qqHqkN4YapWDsFhxx", 
    "date": new Date(1432117722634), 
    "dateModified": new Date(1432117890380) 
} 

Вы планируете заключить репозиторий Github с ошибкой, используя MongoDB 3.0.1 (у меня нет этой ошибки на MongoDB 2.4): https://github.com/JVercout/meteor-defaultValue-date-errored

Любые идеи?

ответ

3

Проблема заключается в том, что выражение new Date() оценивается один раз, когда запускается код, создающий схему. Это значение затем используется как defaultValue. Там нет никакой разницы между:

var x = new SimpleSchema({ 
    date: {defaultValue: new Date(), ...} 
}); 

и

var defaultDate = new Date(); 
var x = new SimpleSchema({ 
    date: {defaultValue: defaultDate, ...} 
}); 

Похоже, что вы будете нуждаться в autoValue, так как она не выглядит, как вы можете использовать функцию defaultValue. На самом деле Collection2 documentation имеет пример использования autoValue для поля «created at». Это зависит от полей, добавленных Collection2, но я видел в вашем git-репо, что вы используете это.

// Force value to be current date (on server) upon insert 
// and prevent updates thereafter. 
createdAt: { 
    type: Date, 
    autoValue: function() { 
    if (this.isInsert) { 
     return new Date; 
    } else if (this.isUpsert) { 
     return {$setOnInsert: new Date}; 
    } else { 
     this.unset(); 
    } 
    } 
} 
Смежные вопросы