在R的mongolite中如何返回_id并提取其中的时间戳?
使用mongolite在R中获取MongoDB的_id并提取文档创建时间
完全可以实现,下面分两种实用方案说明:
方案一:先获取包含_id的文档,再在R中解析时间戳
- 修改查询返回_id字段
mongolite的find()方法默认会排除_id字段,只需显式设置投影参数为'{}'(表示返回所有字段,包括_id)即可:
mongo_uri <- "mongodb+srv://username:password@our-cluster.dwxnd.gcp.mongodb.net/dbname?retryWrites=true&w=majority" con <- mongolite::mongo('users', db = 'dbname', url = mongo_uri) # 指定投影为{},返回所有字段(包含_id) users <- con$find(query = '{}', projection = '{}')
- 从ObjectId提取创建时间
MongoDB的ObjectId前8个字符是毫秒级时间戳,在R中可以直接解析:
# 提取_id前8位十六进制字符串,转换为UTC时间 users$created_at <- as.POSIXct( strtoi(substr(users$`_id`, 1, 8), base = 16), origin = "1970-01-01", tz = "UTC" # 可根据需求调整时区,比如"Asia/Shanghai" )
方案二:用MongoDB聚合管道,在数据库端直接计算时间戳
如果数据量较大,在数据库端处理更高效,利用MongoDB内置函数提取时间戳:
# 聚合管道:保留所有字段,新增created_at字段(MongoDB 4.0+支持) pipeline <- '[ { "$addFields": { "created_at": { "$toDate": { "$substrBytes": ["$_id", 0, 8] } } }} ]' # 执行聚合查询,直接返回带创建时间的文档 users <- con$aggregate(pipeline)
若使用MongoDB旧版本,可调用ObjectId.getTimestamp()函数:
pipeline <- '[ { "$addFields": { "created_at": { "$function": { "body": function(id) { return id.getTimestamp(); }, "args": ["$_id"], "lang": "js" }} }} ]' users <- con$aggregate(pipeline)
内容的提问来源于stack exchange,提问作者Canovice
相关产品推荐
相关产品推荐

