Я хочу выполнить вычисления даты на этапе $ addFields конвейера агрегации. Это работает с жестко закодированными множителями, но завершается неудачно, если я пытаюсь передать значение из документа.
Версия MongoDB - Atlas 4.0.6.
Учитывая эту структуру документа:
{
"_id" : ObjectId("5c9e78c61c9d440000a83cca"),
"title" : "InterventionA",
"thresholdCount" : 4,
"thresholdUnit" : "weeks"
},
{
"_id" : ObjectId("5c9e7d361c9d440000a83ccb"),
"title" : "InterventionB",
"thresholdCount" : 4,
"thresholdUnit" : "days"
}
.. этот запрос работает. Обратите внимание, что множитель (* 4) в $ cond жестко запрограммирован.
const endDate = new Date();
endDate.setHours(0, 0, 0, 0);
const ms1d = 24 * 60 * 60 * 1000; /* milliseconds per day */
const ms1w = 7 * ms1d; /* milliseconds per week */
db.stackex.aggregate([
{
$addFields: {
dateRange: {
$cond: {
if: { $eq: ["$thresholdUnit", "weeks"] },
then: { "start": { $subtract: [endDate, ms1w * 4] }, "end": endDate},
else: { "start": { $subtract: [endDate, ms1d * 4] }, "end": endDate}
}
}
}
}
]);
Желаемые результаты:
{
"_id" : ObjectId("5c9e78c61c9d440000a83cca"),
"title" : "InterventionA",
"thresholdCount" : 4,
"thresholdUnit" : "weeks",
"dateRange" : {
"start" : ISODate("2019-02-28T23:00:00.000-08:00"),
"end" : ISODate("2019-03-29T00:00:00.000-07:00")
}
},
{
"_id" : ObjectId("5c9e7d361c9d440000a83ccb"),
"title" : "InterventionB",
"thresholdCount" : 4,
"thresholdUnit" : "days",
"dateRange" : {
"start" : ISODate("2019-03-25T00:00:00.000-07:00"),
"end" : ISODate("2019-03-29T00:00:00.000-07:00")
}
}
Я хочу заменить жестко (* 4) значением $thresholdCount
для каждого документа. Я не могу понять синтаксис правильно.
Приведенный ниже код завершается с «сообщением»: «Невозможно отменить минимальную продолжительность»
const endDate = new Date();
endDate.setHours(0, 0, 0, 0);
const ms1d = 24 * 60 * 60 * 1000; /* milliseconds per day */
const ms1w = 7 * ms1d; /* milliseconds per week */
db.stackex.aggregate([
{
$addFields: {
dateRange: {
$cond: {
if: { $eq: ["$thresholdUnit", "weeks"] },
then: { "start": { $subtract: [endDate, ms1w * "$thresholdCount"] }, "end": endDate},
else: { "start": { $subtract: [endDate, ms1d * "$thresholdCount"] }, "end": endDate}
}
}
}
}
]);