如何 $project ObjectId 到 mongodb 聚合中的字符串值?

Posted

技术标签:

【中文标题】如何 $project ObjectId 到 mongodb 聚合中的字符串值?【英文标题】:how to $project ObjectId to string value in mongodb aggregate? 【发布时间】:2016-07-03 18:25:36 【问题描述】:

我可以在 aggregate 函数中使用一个运算符来获取字符串而不是 ObjectId 作为响应吗?

db.something.aggregate([
   "$match":  "property":  "$exists": true   ,
   "$project":  "stringId": "$_id.???"  
])

【问题讨论】:

不,没有。聚合框架不会重新转换任何数据类型(除了通过 $substr 将数字字符串转换为 Date 或 Date 转换为 numeric 基本上可以使用诡计)。为什么你会认为这是必要的?在大多数语言中,将ObjectId 值写为字符串相当简单。 @BlakesSeven 总是有原因的 :) 因为简单。当然也可以后期处理。但是,如果我可以将结果传递给其他需要纯字符串的服务/方,那就太好了。 ... 就像我说的,对于大多数语言,BSON 只是转换为本地类型。对于“大多数”语言,简单地输出为字符串根本不需要任何工作。就我个人而言,我更喜欢扩展的 JSON 输出形式,即 "$oid": "56ea9e8bb1e015d13b376db5" ,因为至少这让远程客户端知道数据确实是 ObjectId,因此它可以自己正确解析和转换。这是一件好事,尤其是考虑到存储空间是字符串长度的 一半 【参考方案1】:

聚合函数中没有直接操作符从 ObjectId 中获取字符串。

在 2.6 版本之后,您可以使用 ObjectId.toString() 方法将您的 ObjectId 转换为字符串。首先,您匹配并投影您的 ObjectID。然后您可以使用ObjectID.toString() 将此对象 ID 转换为字符串。

db.something.aggregate(["$match":'property': $exists:true,"$project":"_id":1]) 

然后使用生成的 Object 并使用 ObjectID.tostring() 获取字符串作为响应

编辑:您可以使用来访问对象 id 的 str 属性

ObjectId("507f191e810c19729de860ea").str

来源:mongodb docs

【讨论】:

【参考方案2】:

您可以使用 $concat 运算符内联:

db.something.aggregate(
    [
         $match :
             'property' :
                 $exists:true 
            
        ,
         $project:
             stringId:
                 $concat: [ ObjectId().str ] 
            
        
    ]
)

【讨论】:

对我来说,这不会使“stringId”成为记录的 ObjectId。它使其成为全新 ObjectId 的字符串化版本。特别是,它对于所有返回的文档都是相同的值。所以我认为这是不对的。【参考方案3】:

Mongodb 4.0 引入了$toString 聚合运算符。所以,现在您可以轻松地将 ObjectId 转换为字符串

db.collection.aggregate([
  
    $project: 
      _id: 
        $toString: "$_id"
      
    
  
])

反之亦然,使用$toObjectId 聚合

db.collection.aggregate([
  
    $project: 
      _id: 
        $toObjectId: "$_id"
      
    
  
])

【讨论】:

Mongodb 3.6版怎么样? @Charlie 不,你不能。您必须升级到 4.0,而这正是新版本一直令人感兴趣的地方。 但是如何在 3.9 版本中做到这一点? @Boat Mongodb 没有推出任何 3.9 版本。你说的是驱动版本吗?还是 mongodb 3.6.9? @Boat 然后看看第二条评论。

以上是关于如何 $project ObjectId 到 mongodb 聚合中的字符串值?的主要内容,如果未能解决你的问题,请参考以下文章

编译文件告诉makefile如何编译

如何将自定义 ObjectId 添加到解析服务器对象?

如何将子文档数组的 ObjectId 引用到另一个模型

MongoDB 将相关收集项计数与其他收集结果合并

CastError:转换为 ObjectId 的值失败

如何在 pydantic 模型中解析 ObjectId?