Как я могу сравнить два времени форматирования строки? - PullRequest
3 голосов
/ 26 мая 2019

У меня есть коллекция с именем "project", в которой указано ожидаемое и фактическое время поля, и оба представлены в строковом формате

{
    "_id" : ObjectId("5ce7455d77af2d1143f84d49"),
    "project_name" : "p1",    
    "expected" : "0:11:30",    
    "actual" : "7:30:00",    
}

Как я могу сравнить два времени форматирования строки, используя mongodb?Я хочу найти, если фактическое время больше, чем ожидалось

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Вы можете преобразовать время в любую нужную дату, используя оператор $dateFromString, а затем можете легко использовать $lte $gte для выполнения простых операций сопоставления.

db.collection.find({
  "$expr": {
    "$gt": [
      { "$dateFromString": {
        "dateString": {
          "$concat": ["2018-09-19", "T", "$actual"]
        }
      }},
      { "$dateFromString": {
        "dateString": {
          "$concat": ["2018-09-19", "T", "$expected"]
        }
      }}
    ]
  }
})
1 голос
/ 26 мая 2019

Вы можете использовать $ split с $ toInt (MongoDB 4.0 или новее), чтобы преобразовать строковые значения в количество секунд, а затем использовать $ expr сравнить оба поля:

db.col.aggregate([
    {
        $addFields: {
            expected: {
                $let: {
                    vars: {
                        parts: {
                            $split: [ "$expected", ":" ]
                        }
                    },
                    in: {
                        $sum: [ 
                            { $toInt: { $arrayElemAt: [ "$$parts", 2 ] } },
                            { $multiply: [ 60, { $toInt: { $arrayElemAt: [ "$$parts", 1 ] } }  ] },
                            { $multiply: [ 3600, { $toInt: { $arrayElemAt: [ "$$parts", 0 ] } }  ] }
                        ]
                    }
                }
            },
            actual: {
                $let: {
                    vars: {
                        parts: {
                            $split: [ "$actual", ":" ]
                        }
                    },
                    in: {
                        $sum: [ 
                            { $toInt: { $arrayElemAt: [ "$$parts", 2 ] } },
                            { $multiply: [ 60, { $toInt: { $arrayElemAt: [ "$$parts", 1 ] } }  ] },
                            { $multiply: [ 3600, { $toInt: { $arrayElemAt: [ "$$parts", 0 ] } }  ] }
                        ]
                    }
                }
            }
        }
    },
    {
        $match: {
            $expr: { $gt: [ "$expected", "$actual" ] }
        }
    }
])
...