Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Nombres de campos con prefijo de dólar

En esta sección se resume cómo las diferentes operaciones de inserción y actualización manejan los dólares ($nombres de campos con prefijo). MongoDB desaconseja el uso de nombres de campos prefijados con el signo de dólar porque algunas funcionalidades no son compatibles con estos campos. Ver Restricciones generales para más información.

Los campos con prefijo de dólar ($) están permitidos tanto como nombres de campos de nivel superior como de campos anidados para inserciones.

db.sales.insertOne( {
"$price": 50.00,
"quantity": 30
} )

Se permite el uso de campos prefijados con el símbolo de dólar ($) en inserciones que utilizan palabras reservadas. Nombres de operadores como $inc se pueden usar como nombres de campos, así como palabras como id, db y ref.

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 código de muestra tiene upsert: true, por lo que insertará un nuevo documento si la colección aún no contiene un documento que coincida con el término de query, { "date": "2021-07-07" }. Si este código de muestra coincide con un documento existente, la operación de actualizar fallará dado que $hotel tiene un prefijo de signo de dólar ($).

db.expenses.updateOne(
{ "date": "2021-07-07" },
{ $set: {
"phone": 25.17,
"$hotel": 320.10
} },
{ upsert: true }
)

Los operadores de actualización reemplazan los campos existentes con nuevos documentos o modifican esos campos. En los casos en que la actualización realiza un reemplazo, los nombres de campo de nivel superior con prefijo de dólar ($) no están permitidos.

Considere un documento como

{
"_id": "E123",
"address": {
"$number": 123,
"$street": "Elm Road"
},
"$rooms": {
"br": 2,
"bath": 1
}
}

Podrías usar un operador de actualización que reemplace un documento existente para modificar el campo address.$street, pero no podrías actualizar el campo $rooms de esa manera.

db.housing.updateOne(
{ "_id": "E123" },
{ $set: { "address.$street": "Elm Ave" } }
)

Utiliza $setField como parte de un pipeline de agregación para actualizar campos con prefijo endólares de nivel superior ()$ $rooms como.

Cuando una actualización modifica, en lugar de sustituir, los campos existentes del documento, los campos con prefijo de dólar ($) pueden ser nombres de campos de nivel superior. Los subcampos se pueden acceder directamente, pero se necesita un método asistente para acceder a los campos de nivel superior.

Tip

Considera 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 } }
} )

Utiliza $setField, $getField y $literal en la etapa $replaceWith para modificar campos con prefijo de dólar ($) en una pipelinede 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 pipeline para actualizar el campo $term con el prefijo dólar ($).

db.school.aggregate( [
{ $match: { "registered": true } },
{ $replaceWith: {
$setField: {
field: { $literal: "$term" },
input: "$$ROOT",
value: "spring"
} } },
{ $out: "spring2022" }
] )

Volver

Puntos y signos de dólar

En esta página