Mongoose: docs embutidos no objeto com chaves arbitrárias?

Criado em 12 jan. 2012  ·  40Comentários  ·  Fonte: Automattic/mongoose

Existe uma maneira de usar documentos incorporados em um objeto que não possui chaves predeterminadas? ou seja, em vez de ter uma situação como esta:

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

Ser capaz de dizer algo como:

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

Torna um pouco mais array dessa maneira - mas a idéia é que eu não conheço as chaves com antecedência, mas ainda gostaria de poder ter um documento incorporado.

enhancement

Comentários muito úteis

Esse recurso é OBRIGATÓRIO.

Todos 40 comentários

não há.

E o tipo Mixed ?

@aheckmann - era isso que eu temia, você sabe se isso está no roteiro ou se isso é apenas algo que não é amplamente necessário?

@TooTallNate - certo, esse é o padrão. O problema é que, com a mistura, você perde todas as coisas de validação / esquema que obtém com os documentos incorporados suportados (chaves e matrizes nomeadas).

@ordrin ninguém precisou antes

OK, não percebi que estava fazendo algo tão esotérico! Droga.

Eu tenho um caso de uso para isso, pelo menos acredito que seja relevante.

Estou fazendo um sistema ACL.

Minhas tarefas têm _ids que são Strings.

Eu quero incorporar esses ids nos registros de membro do meu membro (uma matriz de tarefas que eles podem fazer).

Embora eu possa colocar uma matriz de strings em sua propriedade "tasks", eu gostaria, idealmente, de usar DBrefs neste cenário para que eu possa extrair metadados.

@ordrin Acabei de reler isso. Você já olhou para usar o Mixed? Eu posso ter entendido mal b/ci pensar em "documentos incorporados" de forma diferente de como o MongoDB se refere a eles. Aqui está geralmente o que você pode fazer com o Mixed.

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

Isso é bem próximo do que você pediu. Nesse caso, "campo" pode ser atribuído a qualquer valor. Você pode simplesmente atribuir a ele um literal de objeto e adicionar um validador personalizado para garantir que os valores sejam strings.

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

Eu só queria acrescentar que eu estava procurando por uma funcionalidade semelhante a esta. Eu queria ter chaves dinâmicas com valores de esquema fortemente tipados. Seria fantástico se pudéssemos evitar a validação manual.

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

or 

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

+1

+1

+1.

Eu postei um post SO sobre esse problema. Se alguém souber de uma boa forma de validar uma propriedade com chaves dinâmicas fique a vontade para postar.

Se fosse embutido, eu poderia criar um esquema como

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

+1

Seria ótimo ter chaves dinâmicas. Se você for escrever um esquema json, poderá fazer algo como, por exemplo, corresponder a uma chave inteira:

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

alguma solução com chaves dinâmicas ou ainda não?
Exemplo de 2 objetos:
{ 123: { firstname: "firstA", lastname: "lastA" } }
{ 124: { firstname: "firstB", lastname: "lastB" } }

Mesmo problema. Eu quero fazer análises como explicado nos documentos do 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

Eu precisava disso um poço

+1

Pare esses +1 sem sentido, que acabam vigiando as caixas de entrada das pessoas.

Existem botões "Inscrever-se" e "Reação" por um motivo.

+1

@qqilihq , implemente plx, então paramos +1, kthxbye

"ninguém precisou disso antes"
5 anos depois, uma tonelada de +1s depois, ainda não há atualizações sobre isso?

Como este é o problema mais antigo que posso encontrar relacionado a este, vou reabri-lo e fechar o nº 1522 para que o maior número possível de pessoas possa acompanhar as atualizações.

Esse recurso é OBRIGATÓRIO.

Como esse recurso foi lançado tão silenciosamente que eu não estava ciente disso?! 💯

@adamreisnz lol obrigado. Onde você procura atualizações de recursos do Mongoose? Registro de alterações? Twitter?

Changelog normalmente, mas deve ter perdido este!

Esta página foi útil?
0 / 5 - 0 avaliações