Definición
Nuevo en la versión 8.3.
Generar un nuevo aleatorio ObjectId() value.
Usar $createObjectId para generar valores únicos de ObjectId en un pipeline de agregación o en una actualización basada en expresión.
Por ejemplo, puedes generar nuevos campos de identificador o reemplazar los valores id existentes para que otras etapas puedan distinguir entre document. Esto incluye a los operadores que dependen de un valor estable de _id, como $graphLookup.
Sintaxis
$createObjectId tiene la siguiente sintaxis:
{ $createObjectId: { } }
Nota
Debes utilizar un objeto vacío ({}) como argumento.
Comportamiento
$createObjectId se comporta de la siguiente manera:
Argument | Comportamiento |
|---|---|
| Devuelve un nuevo valor aleatorio de tipo BSON |
Cualquier otro valor | La operación falla con |
Tip
Para convertir un valor existente en ObjectId, usa $toObjectId.
Ejemplo
Los ejemplos de esta página utilizan datos del conjunto de datos de muestra sample_mflix. Para obtener más información sobre cómo cargar este conjunto de datos en la implementación autogestionada de MongoDB, consultar Cargar el conjunto de datos de muestra. Si se realizó alguna modificación en las bases de datos de muestra, es posible que se deban descartar y volver a crear las bases de datos para ejecutar los ejemplos de esta página.
Generar identificadores en una vista
Este ejemplo añade valores de ObjectId a una vista para que otras etapas de agregación puedan confiar en un valor estable de _id.
En la sample_mflix base de datos, crea una vista sobre la movies colección que oculte el _id campo original:
db.createView( "moviesView", "movies", [ { $project: { _id: 0, title: 1, cast: 1 } } ] )
Las etapas que dependen de _id no se comportan como se espera con esta vista porque los documentos ya no tienen un campo _id. Por ejemplo, una etapa de recorrido en grafo, como $graphLookup, utiliza _id internamente para rastrear los documents visitados y eliminar duplicados en los resultados.
Para utilizar esta vista con etapas que esperan un identificador estable, crea una segunda vista que agregue un campo único _id con $createObjectId:
db.createView( "moviesViewWithId", "moviesView", [ { $project: { _id: { $createObjectId: {} }, // unique id title: 1, cast: 1 } } ] )
Ahora puedes ejecutar una agregación que trate cada document en moviesViewWithId como un nodo distinto. Por ejemplo, la siguiente etapa $graphLookup encuentra otras películas que comparten miembros del elenco con cada película:
db.movies.aggregate( [ { $graphLookup: { from: "moviesViewWithId", startWith: "$cast", connectFromField: "cast", connectToField: "cast", as: "relatedMovies" } } ] )
En este pipeline, $createObjectId garantiza que cada document en la vista tenga un valor único de ObjectId en _id. Las etapas que dependen de un identificador estable pueden distinguir correctamente entre document.