#javascript #node.js #mongodb #mongodb-query
Вопрос:
У меня есть схема задачи —
const taskSchema = new mongoose.Schema({
type: { type: String, default: '' },
status: {type: String },
due_date : {type: Date}
});
status
может быть «Завершено» и «В ожидании».
type
это может быть «Перезвонить», «Навестить» и «Встретиться».
У меня есть еще один статус «Просрочено», который является особым случаем «В ожидании», если текущая дата ( новая дата() ) больше, чем due_date
, но она хранится в базе данных только как «В ожидании».
Примеры данных —
[
{
type: 'Call Back',
status: 'Pending',
due_date: 2021-08-18T05:40:59.007 00:00
},
{
type: 'Site',
status: 'Pending',
due_date: 2021-09-18T05:40:59.007 00:00
},
{
type: 'Call Back',
status: 'Completed',
due_date: ''
},
{
type: 'Meet',
status: 'Pending',
due_date: 2021-11-18T05:40:59.007 00:00
}
]
Я хочу что-то вроде этого —
{
Pending: {
'Call Back' : 1,
'Meet': 0,
'Site' 1
},
Completed: {
'Call Back' : 1,
'Meet': 0,
'Site' 0
},
Overdue: {
'Call Back' : 0,
'Meet': 1,
'Site' 0
}
}
Я сталкиваюсь с трудностями, потому что на самом деле у меня нет статуса «Просрочено» в моей схеме, но он мне нужен во время группировки.
Ответ №1:
Вы можете использовать $addFields
для условного переопределения status
поля на «Просрочено». Затем продолжайте группировку и разбор данных, как обычно.
{
"$addFields": {
"status": {
"$cond": {
"if": {
$gt: [
"$due_date",
new Date()
]
},
"then": "Overdue",
"else": "$status"
}
}
}
}
Вот игровая площадка Монго для вашей справки.