如何 $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 聚合中的字符串值?的主要内容,如果未能解决你的问题,请参考以下文章