Вы не можете использовать функцию языка программирования для значения существующего поля в конвейере агрегации. Так что это значит ? - Когда вы напишите что-то вроде:
db.users.update_many({},
[{
"$set":{
"registered.newField" :
datetime.strptime(
"$registered.date" ,
"%Y-%m-%dT%H:%M:%S.%fZ").year
}
}])
, тогда функция в строке ниже:
datetime.strptime( "$registered.date" , "%Y-%m-%dT%H:%M:%S.%fZ").year
будет выполнена на сервере приложений и выдаст результат до обращения к базе данных, так что результат будет обновлен до поля "registered.newField"
. Поскольку эта операция выполняется перед нажатием на БД, ваш запрос не сможет получить значение "$registered.date"
. Таким образом, выполнение datetime.strptime().year
в python фактически рассматривает "$registered.date"
как строку, а не получает значение поля и затем преобразует его. Поскольку строка "$registered.date"
не имеет формата "% Y-% m-% dT% H:% M:% S.% fZ", эта функция не будет выполнена.
Для проверки - я бы сказал, что вы можете попытайтесь передать жестко запрограммированное значение, чтобы оно функционировало как datetime.strptime( "2002-05-21T10:59:49.966Z" , "%Y-%m-%dT%H:%M:%S.%fZ").year
, тогда .update()
наверняка сработает.
Разрешение:
Поскольку вы используете это datetime.strptime().year
только для получения года, тогда вы фактически используете операторы агрегирования $ year :
db.users.update_many({}, [
{
$set: {
"registered.newField": { $year: "$registered.date" }
}
}
]);
Тест: mongoplayground
Я предполагаю, что ваше поле "$registered.date"
имеет тип Date
что-то вроде ISODate('2002-05-21T10:59:49.966Z')
, Если в любом случае, если это тип строки, используйте $ dateFromString для преобразования в Date
и затем получить год:
db.users.update_many({}, [
{
$set: {
"registered.newField": {
$year: {
$dateFromString: {
dateString: "$registered.date"
}
}
}
}
}
]);
Тест: mongoplayground