You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R的mongolite中如何返回_id并提取其中的时间戳?

使用mongolite在R中获取MongoDB的_id并提取文档创建时间

完全可以实现,下面分两种实用方案说明:

方案一:先获取包含_id的文档,再在R中解析时间戳

  1. 修改查询返回_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 = '{}')
  1. 从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:50:26