定义
8.3版本新增。
生成新的随机ObjectId() 值。
使用$createObjectId 在聚合管道或基于表达式的更新中生成唯一的 ObjectId 值。
示例,您可以生成新的标识符字段或替换现有的id 值,以便其他阶段可以区分文档。这包括依赖于稳定_id 值的操作符,例如$graphLookup 。
语法
$createObjectId 通过以下语法实现:
{ $createObjectId: { } }
注意
必须使用空对象({}) 作为参数。
行为
$createObjectId 行为如下:
Argument | 行为 |
|---|---|
| 返回BSON类型 |
任何其他值 | 操作失败并返回 |
提示
要将现有值转换为 ObjectId,请使用$toObjectId 。
例子
本页上的示例使用sample_mflix示例数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载示例数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
在视图中生成标识符
此示例将 ObjectId 值添加到视图中,以便其他聚合阶段可以依赖稳定的 _id值。
在 sample_mflix数据库中,通过 movies集合创建视图,隐藏原始 _id字段:
db.createView( "moviesView", "movies", [ { $project: { _id: 0, title: 1, cast: 1 } } ] )
依赖_id 的阶段在此视图下无法按预期运行,因为文档不再具有_id 字段。示例,像 这样的图表遍历阶段在内部使用$graphLookup _id来追踪已访问的文档并对结果去重。
要将此视图与需要稳定标识符的阶段一起使用,请创建第二个视图,添加一个带有 的唯一_id $createObjectId字段:
db.createView( "moviesViewWithId", "moviesView", [ { $project: { _id: { $createObjectId: {} }, // unique id title: 1, cast: 1 } } ] )
moviesViewWithId现在,您可以运行一个聚合,将 中的每个文档视为不同的节点。示例,以下$graphLookup 阶段会查找与每部电影股票演员阵容的其他电影:
db.movies.aggregate( [ { $graphLookup: { from: "moviesViewWithId", startWith: "$cast", connectFromField: "cast", connectToField: "cast", as: "relatedMovies" } } ] )
在此管道中, 确保视图中的每个文档在 中都有唯一的$createObjectId ObjectId_id 值。然后,依赖于稳定标识符的阶段可以正确区分文档。