Sé que esta respuesta ya ha sido aceptada, pero quería señalar que la mangosta se encarga de la mayor parte del casting para usted ... la mayoría de las veces. Si bien es conveniente que la mangosta haga esto, abstrae el verdadero comportamiento de mongo. Por ejemplo, el meloncillo le permite hacer algo como esto:
PersonModel.findById("4cdf00000000000000007822", ...);
Sin embargo, si se trató de consultar la base de datos directamente (sin mangosta), esto no trabajo:
PersonCollection.find({_id: "4cdf00000000000000007822"}, ...);
Esto es porque Los objetos no son cadenas ... son objetos. Internamente, el meloncillo convierte esa cadena en una OBJECTID y luego realiza una consulta en la base de datos para la consulta final se ve un poco como esto:
PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);
Además, cada camino en un esquema tiene un método "lanzador". Este es un método privado, pero es muy práctico cuando lo necesitas. TENGA EN CUENTA QUE LOS MÉTODOS caster
DESCRITOS A CONTINUACIÓN ESTÁN INDOCUMENTADOS Y PUEDEN CAMBIAR SIN ADVERTENCIA. Utilice a su propio riesgo (lo siento por gritar):
// Use PersonModel.schema.paths() to get all paths and loop over them if you want
var key = "name";
var pathObj = PersonModel.schema.path(key);
if(!pathObj) pathObj = PersonModel.schema.virtualpath(key);
if(!pathObj) { /* not found: return, continue, exit, whatever */ }
// UNDOCUMENTED: USE AT YOUR OWN RISK
var caster = pathObj.caster || pathObj;
var castedValue = caster.cast(req.body.name);
¿Por qué sé esto? Porque si desea utilizar algunas de las características más avanzadas de mongo, como la agregación, deberá emitir sus propios valores a medida que crea la interconexión. También he necesitado lanzar valores manualmente para ciertas consultas que usaron el operador $in
... quizás ya no sea necesario. El punto es que si tiene problemas para obtener los resultados que espera, intente emitir los valores usted mismo.
_ "Tenga en cuenta que el primer objeto proviene de la solicitud, por lo que está hecho completamente por cadenas." _ - ¿Por qué no lo cambia para devolver un número y un booleano en los lugares apropiados? El uso de "tal" en la oración que cité implica que solo se permiten cadenas, pero eso no es cierto si se trata de JSON. (Es decir, JSON en sí es un formato basado en cadenas, pero puede representar números y booleanos, y cuando se analiza el JSON, dichas propiedades se convierten en números y booleanos ...) – nnnnnn
¿Están corregidas las propiedades de su esquema, o lo necesita? ellos dinámicos? – Mahn
@nnnnnn Bueno, el problema es que Express toma la información del formulario 'myObject [name]: name, myObject [someNumber]: 23', y Express construye el myObject configurando de manera predeterminada cada propiedad en una Cadena. – renatoargh