Mongoose: docs incrustados en objeto con claves arbitrarias?

Creado en 12 ene. 2012  ·  40Comentarios  ·  Fuente: Automattic/mongoose

¿Hay alguna manera de usar documentos incrustados dentro de un objeto que no tiene claves predeterminadas? es decir, en lugar de tener una situación como esta:

var myschema = new mongoose.Schema({
   field : { foo: String, bar: String }
});

Ser capaz de decir algo como:

var myschema = new mongoose.Schema({
   field : { *: String }
});

Lo hace un poco más ordenado de esa manera, pero la idea es que no conozco las claves de antemano, pero aún me gustaría poder tener un documento incrustado.

enhancement

Comentario más útil

Esta función es IMPRESCINDIBLE.

Todos 40 comentarios

no hay.

¿Qué pasa con el tipo Mixed ?

@aheckmann : eso es lo que temía, ¿sabe si esto está en la hoja de ruta o si es algo que no se necesita mucho?

@TooTallNate : correcto, ese es el valor predeterminado. El problema es que con la mezcla pierdes todas las cosas de validación/esquema que obtienes con documentos integrados compatibles (claves y matrices con nombre).

@ordrin nadie lo ha necesitado antes

OK, ¡no me di cuenta de que estaba haciendo algo tan esotérico! Maldita sea.

Tengo un caso de uso para esto, al menos creo que es relevante.

Estoy haciendo un sistema ACL.

Mis tareas tienen _ids que son cadenas.

Quiero incrustar esas identificaciones en los registros de miembros de mi miembro (una variedad de tareas que pueden hacer).

Si bien puedo, por supuesto, simplemente poner una matriz de cadenas en su propiedad de "tareas", idealmente me gustaría usar DBrefs en este escenario para poder extraer metadatos.

@ordrin Acabo de volver a leer esto. ¿Has mirado usar Mixed? Es posible que haya entendido mal b / ci pensar en "documentos integrados" de manera diferente a como MongoDB se refiere a ellos. En general, esto es lo que puede hacer con Mixed.

var myschema = new mongoose.Schema({
   field : mongoose.Schema.Types.Mixed
});

Esto se acerca bastante a lo que pediste. En este caso, el "campo" se puede asignar a cualquier valor. Puede simplemente asignarle un objeto literal y agregar un validador personalizado para garantizar que los valores sean cadenas.

myschema.path('field').validate(yourCustomValidator, 'your custom vaildator failed msg');

function yourCustomValidator (value) {
  // check that value is an object etc
  return true|false
}

var M = mongoose.model('M', myschema);
var m = new M;
m.field = { might: "work", for: "you" }
m.save();

http://mongoosejs.com/docs/schematypes.html

Solo quería agregar que estaba buscando una funcionalidad similar a esta. Quería tener claves dinámicas con valores de esquema fuertemente tipados. Sería fantástico si pudiéramos evitar tener que realizar manualmente la validación.

new mongoose.Schema({
    dynamicKey: {foo: Number, isAwesome: Boolean}
});

or 

new mongoose.Schema({
    dynamicKey: value is always only a Number
});

+1

+1

+1.

Publiqué una publicación SO con respecto a este problema. Si alguien conoce una buena forma de validar una propiedad con claves dinámicas, no dude en publicarla.

Si estuviera integrado, podría diseñar un esquema como

new Schema({
  myDynamicKeyObj: {
    type: Dynamic, 
    key: {type: String, match: /[a-z]*/i}, 
    val: [String] 
  } 
})

+1

Sería genial tener claves dinámicas. Si va a escribir un esquema json, puede hacer algo como, por ejemplo, para hacer coincidir una clave entera:

"^[0-9]+$": {
    "$ref": "#/definitions/mydefinition"
}

¿alguna solución que tenga claves dinámicas o aún no?
Ejemplo de 2 objetos:
{ 123: { firstname: "firstA", lastname: "lastA" } }
{ 124: { firstname: "firstB", lastname: "lastB" } }

El mismo problema. Quiero hacer análisis como se explica en los documentos de mongodb. http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/

+1

:+1:

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

He necesitado esto un pozo

+1

Detén esos +1 sin sentido que terminan vigilando las bandejas de entrada de las personas.

Hay botones de "Suscribirse" y "Reacción" por una razón.

+1

@qqilihq , implemente plx, luego paramos +1, kthxbye

"nadie lo ha necesitado antes"
5 años después, un montón de +1 más tarde, ¿todavía no hay actualizaciones sobre esto?

Dado que este es el problema más antiguo que puedo encontrar relacionado con este, lo volveré a abrir y cerraré el número 1522 para que la mayor cantidad posible de personas puedan realizar un seguimiento de las actualizaciones.

Esta función es IMPRESCINDIBLE.

¿Cómo se lanzó esta función tan silenciosamente que no me di cuenta? 💯

@adamreisnz jajaja gracias. ¿Dónde busca las actualizaciones de funciones de Mongoose? Registro de cambios? ¿Gorjeo?

Registro de cambios por lo general, ¡pero debe haberse perdido este!

¿Fue útil esta página
0 / 5 - 0 calificaciones