如何在 MongoDB 聚合操作中将 $project ObjectId 转换为字符串值?

48

在聚合函数中是否有一种操作符可以用于获取字符串而不是ObjectId作为响应?

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

2
没有。聚合框架不会重新转换任何数据类型(除了通过 $substr 从数字转换为字符串,以及从数字转换为日期或日期转换为数字可以通过一些技巧实现)。你为什么认为需要这样做呢?在大多数编程语言中,将 ObjectId 值写成字符串非常简单。 - Blakes Seven
2
@BlakesSeven 总会有为什么 :) 因为简单。当然你可以进行后处理。但如果我只需将结果传递给需要纯字符串的其他服务/方,那就太好了。... - matus
1
就像我说的,对于大多数语言,BSON 只是转换为本地类型。对于“大多数”语言来说,根本不需要任何工作就可以简单地输出为字符串。个人而言,我更喜欢扩展的 JSON 输出形式,即 { "$oid": "56ea9e8bb1e015d13b376db5" },因为这样远程客户端就知道数据确实是一个 ObjectId,所以它可以自己解析和转换。这是一件好事,特别是考虑到存储只有字符串长度的一半 - Blakes Seven
3个回答

98

Mongodb 4.0 推出了$toString 聚合操作符。现在,您可以轻松地将ObjectId转换为字符串。

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

或者使用$toObjectId聚合函数来实现反之亦然。

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

16
MongoDB 版本 3.6 中呢? - Charlie
4
不,你不能。你必须升级到4.0版本,这就是新版本始终吸引人的地方。 - Ashh
但是在版本3.9中如何实现这个? - Boat
@Boat Mongodb还没有推出任何3.9版本。你是在说驱动程序版本吗?还是指Mongodb 3.6.9? - Ashh
@Ashh 我指的是 MongoDB 3.6.9。 - Boat
1
@Boat 然后看一下第二条评论。 - Ashh

11

聚合函数中没有直接的运算符可以从ObjectId获取字符串。

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

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

接着使用生成的对象,并使用ObjectID.tostring()来获取字符串作为响应。

编辑:您可以使用str属性访问对象ID。

ObjectId("507f191e810c19729de860ea").str

来源:mongodb 文档


-17

您可以使用$concat运算符来进行内联操作:

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

1
对我来说,这并不会使“stringId”成为记录的ObjectId。它只是一个新的ObjectId的字符串版本。特别地,对于返回的所有文档,它都是相同的值。因此,我认为这是错误的。 - mcdave
lol失败...... - Nicholas Hamilton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接