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?
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
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.