En esta sección se resume cómo las diferentes operaciones de inserción y actualización manejan los dólares ($) nombres de campo con prefijo. MongoDB desaconseja el uso de nombres de campo con prefijo de dólar porque algunas funciones no son compatibles con estos campos. Consulte Restricciones generales para más información.
Operaciones de inserción
Se permiten campos con prefijo dólar ($) como nombres de campos anidados y de nivel superior para inserciones.
db.sales.insertOne( { "$price": 50.00, "quantity": 30 } )
Se permiten campos con prefijo de dólar () en inserciones que utilizan palabras reservadas.$ $inc Se pueden usar nombres de operadores como como nombres de campo, así como palabras id como, db refy.
db.books.insertOne( { "$id": "h1961-01", "location": { "$db": "novels", "$ref": "2007042768", "$inc": true } } )
Una actualización que crea un nuevo documento durante una inserción y actualización se trata como un insert en lugar de un update para la validación del nombre de campo. Las$inserciones y actualizaciones pueden aceptar campos con el prefijo dólar (). Sin embargo, las inserciones y actualizaciones son un caso especial, y operaciones de actualización similares pueden causar un error si la match parte de la actualización selecciona un documento existente.
Este ejemplo de código tiene upsert: true, por lo que insertará un nuevo documento si la colección no contiene ya un documento que coincida con el término de consulta { "date": "2021-07-07" }. Si este ejemplo coincide con un documento existente, la actualización fallará, ya que $hotel tiene el prefijo dólar ($).
db.expenses.updateOne( { "date": "2021-07-07" }, { $set: { "phone": 25.17, "$hotel": 320.10 } }, { upsert: true } )
Actualizaciones de reemplazo de documentos
Los operadores de actualización reemplazan los campos existentes con nuevos documentos o los modifican. En los casos en que la actualización realiza un reemplazo, los campos con el prefijo dólar ($) no se permiten como nombres de campo de nivel superior.
Considere un documento como
{ "_id": "E123", "address": { "$number": 123, "$street": "Elm Road" }, "$rooms": { "br": 2, "bath": 1 } }
Podría utilizar un operador de actualización que reemplace un documento existente para modificar el campo address.$street, pero no podría actualizar el campo $rooms de esa manera.
db.housing.updateOne( { "_id": "E123" }, { $set: { "address.$street": "Elm Ave" } } )
Utilice como parte de una secuencia de agregación $setField para
actualizar campos con prefijo endólares de nivel superior ()$ $rooms como.
Actualizaciones que modifican documentos
Cuando una actualización modifica, en lugar de reemplazar, los campos de un documento existente, los campos con el prefijo dólar ($) pueden ser nombres de campo de nivel superior. Se puede acceder directamente a los subcampos, pero se necesita un método auxiliar para acceder a los campos de nivel superior.
Consideremos una colección con documentos como este registro de inventario:
{ _id: ObjectId("610023ad7d58ecda39b8d161"), "part": "AB305", "$bin": 200, "quantity": 100, "pricing": { sale: true, "$discount": 60 } }
El subcampo pricing.$discount puede consultarse directamente.
db.inventory.findAndModify( { query: { "part": { $eq: "AB305" } }, update: { $inc: { "pricing.$discount": 10 } } } )
Utilice $getField y para acceder al valor $literal del $bin campo de nivel superior.
db.inventory.findAndModify( { query: { $expr: { $eq: [ { $getField: { $literal: "$bin" } }, 200 ] } }, update: { $inc: { "quantity": 10 } } } )
Actualizaciones mediante pipelines de agregación
$setFieldUtilice, $getField y $literal en la etapa para $replaceWith modificar$ los campos con prefijo en dólares () en una secuencia de agregación.
Considere una colección de registros escolares como:
db.school.insertOne ( { "_id": 100001, "$term": "fall", "registered": true, "grade": 4 } )
Cree una nueva colección para el semestre de primavera utilizando una canalización para actualizar el campo con$ prefijo $term dólar ().
db.school.aggregate( [ { $match: { "registered": true } }, { $replaceWith: { $setField: { field: { $literal: "$term" }, input: "$$ROOT", value: "spring" } } }, { $out: "spring2022" } ] )