Mongoose: É possível preencher sem `_id`?

Criado em 26 dez. 2014  ·  82Comentários  ·  Fonte: Automattic/mongoose

Eu verifiquei a API http://mongoosejs.com/docs/populate.html e experimentei. Parece que populate só funciona em _id estrangeiros. Mesmo que haja uma opção match , basta adicionar mais condições de filtragem na condição de consulta _id . Não há como apenas preencher com campos não envolvidos com _id .

No meu projeto, mantemos o _id como ObjectId e temos outro campo como número de incremento automático. Por exemplo, o modelo customers tem _id como Objeto e cuid como número incremental. Outras coleções apenas fazem referência a cuid não a _id .

Seria ótimo poder personalizar isso?
Existe alguma limitação de design causando a falta desse recurso?

enhancement

Comentários muito úteis

@rturk Eu realmente gosto desse plugin, obrigado por apontá-lo. @alexmingoia quais são seus pensamentos sobre: ​​mesclar seu módulo no núcleo do mangusto? A ideia de usar virtuais para lidar com populações mais genéricas (sem ter um campo real persistido no banco de dados) é realmente poderosa.

Todos 82 comentários

Seria ótimo poder personalizar isso, mas agora aplicamos _id . Eu não consigo pensar em uma boa razão de cabeça para que não. Vou ter que investigar mais.

A capacidade de preencher não apenas em um único outro campo, mas até mesmo em um conjunto de campos, é quase necessária para oferecer suporte adequado à fragmentação, o que é um grande caso de uso para nós.

Por exemplo, temos uma coleção "alunos" que pode ter uma chave de fragmentação para "assinatura"; quando preenchemos os dados do aluno de nosso modelo de seções (que contém uma matriz de alunos), temos a assinatura no documento, mas ela só pesquisará com base no _id armazenado em "aluno" em vez de nos permitir especificar que ele também deve mapear o campo "tarefa" dos documentos para "tarefa" no aluno.

Como estaríamos fazendo uma pesquisa sem a chave de fragmentação ao preencher, isso torna a fragmentação inútil, exigindo que todos os fragmentos sejam atingidos para recuperar os dados em vez de apenas um.

Isso é algo para o qual estaríamos dispostos a financiar o desenvolvimento ou até mesmo fazer nós mesmos se pudéssemos obter alguma orientação sobre onde fazer o trabalho. É uma grande necessidade para nossa empresa (GradeCam).

@taxilian você está configurando a opção de esquema shardKey ? AFAIK é para isso que serve essa opção.

Na verdade, ainda não comecei a fazer isso porque estou procurando uma solução para esse problema; o populate leva em conta o shardKey? Meu entendimento era que shardKey afetava apenas atualizações e inserções

Seria ótimo poder especificar o campo que deve ser "unido por", por exemplo, eu gostaria de poder preencher não apenas pelo campo userId (ou seja, _id), mas também por userType, userGroup etc.
Obrigado!

+1

+1 seria muito útil

+1 mesmo aqui!

+1 adoro ter isso

+1

+1

+1

Seria especialmente bom poder selecionar a variável com a qual você gostaria de preencher adicionando um parâmetro como key :

Por exemplo, se tivesse posts que eu quisesse preencher os parâmetros author e comments , mas os parâmetros estão mantendo parâmetros não ObjectId (nome de usuário do usuário e título dos comentários) antes da população:

{
author: "user1",
comments:["comment5", "comment6"],
title:"Post1"
}

Seria bom poder adicionar um parâmetro como "key" para permitir que o mongo saiba qual parâmetro pesquisar:

Posts.find().populate([{path:"author", model:"Users", key:"username"}, {path:"comments", model:"Comments", key:"title"}])

Isso preencheria o parâmetro author com um usuário encontrado por nome de usuário, bem como preencheria o parâmetro comments com comentários encontrados por seu título (eu percebo que os comentários por título são um pouco irreais, mas você obtém o ponto).

+1

+1

+1

+1

+1

+1

+1

Grande concordo. Eu adoraria a capacidade de definir esquemas de população personalizados. Seria ótimo para qualquer esquema com um ou mais campos que são caminhos de arquivo, permitindo que o preenchimento seja lido do armazenamento.

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

Tente este código: https://github.com/alexmingoia/mongoose-populate-virtuals.

Na verdade, algum motivo para não mesclar o código de Alex no repositório principal e tornar isso um recurso central?

@rturk Eu realmente gosto desse plugin, obrigado por apontá-lo. @alexmingoia quais são seus pensamentos sobre: ​​mesclar seu módulo no núcleo do mangusto? A ideia de usar virtuais para lidar com populações mais genéricas (sem ter um campo real persistido no banco de dados) é realmente poderosa.

Isso seria o ideal. Seria muito melhor no núcleo porque sobrecarrega Query.prototype.populate e outras funcionalidades do núcleo.

A única coisa que me impede de criar uma solicitação pull é que há pouca ou nenhuma cobertura de teste e falta documentação. Estou usando-o em produção em vários cenários e é estável, mas acho que se alguém escrevesse um conjunto de testes, isso poderia expor alguns problemas menores ou idiossincrasias que precisam ser documentadas.

Alguém está disposto a enfrentar o conjunto de testes? Se não - eu posso fazer isso, mas não espere que chegue antes do próximo mês.

Vou dar uma olhada. Eu estava querendo reescrever preencher de qualquer maneira :)

Faça um ping no IRC (freenode, amingoia ) ou gitter se você tiver alguma dúvida sobre o código.

https://github.com/whitecolor/mongoose-fill também faz um ótimo trabalho para preencher usando dados de outros modelos

+1

+1

+1

isso é um dever :)

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+1

+3

+1

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