gpt4 book ai didi

python - 是否可以在 pymongo 更新运算符中调用函数?

转载 作者:行者123 更新时间:2023-12-04 10:06:53 24 4
gpt4 key购买 nike

我尝试使用 pyMongo 向 MongoDB 中的文档添加另一个字段。作为样本,我从 here 获得了随机用户我将在“注册”部分添加另一个字段:

from datetime import datetime
from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['metadata']
db.users.update_many({},
[{
"$set":{
"registered.newField" : "$registered.date"
}
}])

这是完美的,但每当我要使用另一个功能并使用 "$registered.date"作为输入参数,似乎 "registered.date"不再解析。
db.users.update_many({},
[{
"$set":{
"registered.newField" :
datetime.strptime(
"$registered.date" ,
"%Y-%m-%dT%H:%M:%S.%fZ").year
}
}])

这个抛出异常:

time data '$registered.date' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'



这是文件的样子:
 {
"gender": "male",
"name": {
"title": "mr",
"first": "brad",
"last": "gibson"
},
"registered": {
"date": "2002-05-21T10:59:49.966Z",
"age": 17
},
.....
}

最佳答案

您实际上不能对聚合管道中的现有字段值使用编程语言的函数。那是什么意思呢? - 当你写这样的东西时:

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 

将在应用服务器中执行并在查询命中 DB 之前生成结果,因此该结果将更新为 "registered.newField" field 。由于此操作是在命中 DB 之前进行的,因此您的查询将无法获得 "$registered.date"值(value)。所以 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

关于python - 是否可以在 pymongo 更新运算符中调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61540749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com