【问题标题】:how to $project ObjectId to string value in mongodb aggregate?如何 $project ObjectId 到 mongodb 聚合中的字符串值?
【发布时间】: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,因此它可以自己正确解析和转换。这是一件好事,尤其是考虑到存储空间是字符串长度的 一半

标签: mongodb mongodb-query aggregation-framework


【解决方案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 然后看看第二条评论。
    猜你喜欢
    • 2015-02-18
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多