Como posso preencher "componentes" no documento de exemplo:
{
"__v": 1,
"_id": "5252875356f64d6d28000001",
"pages": [
{
"__v": 1,
"_id": "5252875a56f64d6d28000002",
"page": {
"components": [
"525287a01877a68528000001"
]
}
}
],
"author": "Book Author",
"title": "Book Title"
}
Este é o meu JS, onde obtenho o documento do Mongoose:
Project.findById(id).populate('pages').exec(function(err, project) {
res.json(project);
});
...populate('pages pages.page.components').exec...
, obtenho a mesma coisa indicada no documento de exemplo. Nada mudou.Respostas:
O Mongoose 4.5 suporta isso
E você pode ingressar em mais de um nível profundo
fonte
pages.$.page.component
não épages.$.component
. Como ele sabe olhar no objeto da página?Isso funciona para mim:
Documentação: Model.populate
fonte
Como outros notaram,
Mongoose 4
apóia isso. É muito importante observar que você também pode percorrer mais profundamente do que um nível, se necessário, embora isso não seja mencionado nos documentos:fonte
Você pode preencher vários documentos aninhados como este.
fonte
populate: ['components','AnotherRef']
populate: 'components AnotherRef'
É a melhor solução:
fonte
page
tem outras propriedades não preenchíveis.Achei muito útil criar um penasjs antes de um gancho para preencher uma relação profunda de nível 2 de referência. Os modelos de mangusto simplesmente têm
então em penas, antes do anzol:
Tão simples em comparação com alguns outros métodos que estava tentando fazer.
fonte
Eu encontrei essa pergunta por meio de outra pergunta que era específica do KeystoneJS, mas foi marcada como duplicada. Se alguém aqui está procurando uma resposta do Keystone, foi assim que fiz minha consulta de preenchimento profundo no Keystone.
População de dois níveis do Mongoose usando KeystoneJs [duplicado]
fonte
Você também pode fazer isso usando
$lookup
agregação e provavelmente a melhor forma de povoar agora está se extinguindo do mongofonte
Mongoose 5.4 suporta isso
fonte
Para alguém que tem problemas
populate
e também deseja fazer isso:clients
,users
,rooms
,messasges
.refPath
ou referência dinâmicapopulate
compath
emodel
opçõesfindOneAndReplace
/replaceOne
com$exists
CONTEXTO
Objetivo
clients
,users
&bot
.clients
ouusers
com seus Modelos Mongoose. _sender type client models isclients
, for user isusers
.Esquema de mensagem :
SOLUÇÃO
Minha solicitação de API do lado do servidor
Meu código
Função utilitária (no
chatUtils.js
arquivo) para obter o tipo de mensagem que deseja salvar:Meu lado do servidor (usando Nodejs) para obter a solicitação de salvar a mensagem:
DICAS :
Para o banco de dados:
refPath
, usamos o utilitáriogetSenderModel
que é usado nopopulate()
. Isso é por causa do bot. Osender.type
pode ser:users
com seu banco de dados,clients
com seu banco de dados ebot
sem banco de dados. OrefPath
precisa de uma verdadeira referência de modelo, se não, Mongooose lança um erro.sender._id
pode ser um tipoObjectId
para usuários e clientes ounull
para o bot.Para lógica de solicitação de API:
quickReply
mensagem (Message DB deve ter apenas um quickReply, mas quantas mensagens de texto simples você quiser). Usamos o emfindOneAndUpdate
vez dereplaceOne
oufindOneAndReplace
.findOneAndUpdate
) e apopulate
operação com ocallback
de cada um. Isto é importante se você não sabe se o usoasync/await
,then()
,exec()
oucallback(err, document)
. Para obter mais informações, consulte o Populate Doc .overwrite
opção e sem$set
operador de consulta.upsert
opção.findOneAndUpdate
e para opopulate()
.populate
, criamos uma referência de modelo dinâmico personalizado com ogetSenderModel
. Podemos usar a referência dinâmica Mongoose porque osender.type
forbot
não tem nenhum modelo Mongoose. Usamos um Populating Across Database commodel
epath
optins.Passei muitas horas resolvendo pequenos problemas aqui e ali e espero que isso ajude alguém! 😃
fonte
Lutei com isso por um dia inteiro sangrento. Nenhuma das soluções acima funcionou. A única coisa que funcionou no meu caso é um exemplo como o seguinte:
é fazer o seguinte: (assumindo preencher após buscar - mas também funciona ao chamar populate da classe Model (seguido por exec))
Em outras palavras, a propriedade do caminho mais externo deve conter o caminho completo. Nenhum caminho parcialmente completo acoplado às propriedades de preenchimento parecia funcionar (e a propriedade do modelo não parece ser necessária; faz sentido, já que está incluída no esquema). Levei um dia inteiro para descobrir isso! Não sei por que os outros exemplos não funcionam.
(Usando Mongoose 5.5.32)
fonte
Remover referência de documentos
Isso funcionou para mim.
fonte