Как я могу определить Date в моей определенной схеме mon goose, например, чтобы вернуть правильно отформатированные дату и время? - PullRequest
1 голос
/ 25 января 2020

Итак, я хочу создать модель задачи / задачи для своего приложения, и для каждой задачи я хочу иметь красивую дату и время создания в нижнем колонтитуле. Я уже добился этого успешно в похожем клиентском приложении:

function getCurrentDateTime () {
    const date = new Date();

    let day = date.getDate().toString().length <= 1 ? '0' + date.getDate() : date.getDate();

    let month = date.getMonth().toString().length <= 1 ? `0${parseInt(date.getMonth() + 1)}` : date.getMonth();

    let year = date.getFullYear().toString().length <= 1 ? '0' + date.getFullYear() : date.getFullYear();
    let hours = date.getHours().toString().length <= 1 ? '0' + date.getHours() : date.getHours();
    let minutes = date.getMinutes().toString().length <= 1 ? '0' + date.getMinutes() : date.getMinutes();
    let seconds = date.getSeconds().toString().length <= 1 ? '0' + date.getSeconds() : date.getSeconds();

    return { day, month, year, hours, minutes, seconds };
}

function createTask (statePlaceholder, currentTaskText) {
    let newTask = {
        id: uuid(),
        text: currentTaskText,
        completed: false,
        creationDateTime: {
            date: `${getCurrentDateTime().day}/${getCurrentDateTime().month}/${getCurrentDateTime().year}`,
            time: `${getCurrentDateTime().hours}:${getCurrentDateTime().minutes}:${getCurrentDateTime().seconds}`
        }
    };

    ...
}

, и это выглядит так:

enter image description here

Я хочу сохранить все элементы задач (текст, выполненные или нет, а также дату / время создания) на MongoDB, и я не знаю, как определить дату и время, чтобы получить то, что вы видите на изображении, но исходящий из MongoDB.

const TaskSchema = new mongoose.Schema({
    text: { type: String, required: true },
    completed: Boolean,
    creationDateTime: {
        date: // day/month/year,
        time: // timestamp
    }
});

Как правильно определить дату и время в схеме mon goose, определенной мной?

1 Ответ

1 голос
/ 27 января 2020

То, что вы пытаетесь сохранить как creationDateTime, определенно должно иметь тип Date, и вы не должны хранить его как строку или объект. Это упростит любые будущие запросы и позволит избежать некоторых непредвиденных проблем, которые могут возникнуть, если вы сохранили это значение в виде строки. Вы можете воспользоваться функцией по умолчанию mon goose, которая будет запускаться Date.now каждый раз, когда вы сохраняете новый документ, поэтому ваша схема может выглядеть следующим образом:

const TaskSchema = new mongoose.Schema({
    text: { type: String, required: true },
    completed: Boolean,
    creationDateTime: {
        type: Date,
        default: Date.now
    }
});

Когда Что касается форматирования, mon goose предлагает хорошую возможность определения виртуальных свойств. Такое поле не будет храниться в базе данных, но будет динамически оцениваться, и именно здесь вы можете повторно использовать свои логи форматирования c:

function dateTimeToParts(date) {
    let day = date.getDate().toString().length <= 1 ? '0' + date.getDate() : date.getDate();
    let month = date.getMonth().toString().length <= 1 ? `0${parseInt(date.getMonth() + 1)}`: date.getMonth();
    let year = date.getFullYear().toString().length <= 1 ? '0' + date.getFullYear() : date.getFullYear();
    let hours = date.getHours().toString().length <= 1 ? '0' + date.getHours() : date.getHours();
    let minutes = date.getMinutes().toString().length <= 1 ? '0' + date.getMinutes() : date.getMinutes();
    let seconds = date.getSeconds().toString().length <= 1 ? '0' + date.getSeconds() : date.getSeconds();
    return { day, month, year, hours, minutes, seconds };
}

TaskSchema.virtual('createdOn').get(function() {
    let { day, month, year, hours, minutes, seconds } = dateTimeToParts(
        this.creationDateTime
    );
    return {
        date: `${day}/${month}/${year}`,
        time: `${hours}:${minutes}:${seconds}`
    };
});

Таким образом, имея ниже документ в вашей базе данных MongoDB:

{ 
    "_id" : ObjectId("5e2e7c93397e8124b81dfcaa"), 
    "creationDateTime" : ISODate("2020-01-27T06:00:51.409Z"), 
    "text" : "abc", 
    "__v" : 0 
}

Вы можете запустить следующий код:

let task = await Task.findOne({ _id: ObjectId("5e2e7c93397e8124b81dfcaa") });
console.log(task.createdOn);

Чтобы получить следующий вывод:

{ date: '26/01/2020', time: '22:00:51' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...