Não consigo preencher manualmente ou automaticamente o campo do criador em um objeto recém-salvo ... a única maneira que posso encontrar é consultar novamente os objetos que já tenho e que odiaria fazer.
Esta é a configuração:
var userSchema = new mongoose.Schema({
name: String,
});
var User = db.model('User', userSchema);
var bookSchema = new mongoose.Schema({
_creator: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
description: String,
});
var Book = db.model('Book', bookSchema);
É aqui que estou puxando meu cabelo
var user = new User();
user.save(function(err) {
var book = new Book({
_creator: user,
});
book.save(function(err){
console.log(book._creator); // is just an object id
book._creator = user; // still only attaches the object id due to Mongoose magic
console.log(book._creator); // Again: is just an object id
// I really want book._creator to be a user without having to go back to the db ... any suggestions?
});
});
EDITAR: o mangusto mais recente corrigiu esse problema e adicionou a funcionalidade de preenchimento, consulte a nova resposta aceita.
creator.profile
Caso alguém ainda esteja procurando por isso.
O Mongoose 3.6 introduziu muitos recursos interessantes para preencher:
ou:
Veja mais em: https://github.com/LearnBoost/mongoose/wiki/3.6-Release-Notes#population
Mas, dessa forma, você ainda consultaria o usuário novamente.
Um pequeno truque para realizá-lo sem consultas extras seria:
fonte
book._creator = user;
depois desave()
é a única resposta correta entre todas as respostas atuais; todas as outras respostas exigem uma consulta adicional.A solução para mim foi usar
execPopulate
, assimfonte
Solução que retorna uma promessa (sem retornos de chamada):
Use Documento # preencher
Possível Implementação
Leia sobre a população de documentos aqui .
fonte
Só para elaborar e dar outro exemplo, pois me ajudou. Isso pode ajudar aqueles que desejam recuperar objetos parcialmente preenchidos após salvar. O método também é um pouco diferente. Gastei mais de uma ou duas horas procurando a maneira correta de fazer isso.
fonte
Pensei em acrescentar a isso para esclarecer as coisas para novatos completos como eu.
O que é extremamente confuso se você não tomar cuidado é que existem três métodos de preenchimento muito diferentes. Eles são métodos de objetos diferentes (Modelo vs. Documento), recebem diferentes entradas e fornecem diferentes saídas (Documento vs. Promessa).
Aqui estão eles para aqueles que estão perplexos:
Document.prototype.populate ()
Veja a documentação completa.
Este trabalha em documentos e retorna um documento. No exemplo original, seria assim:
Como ele funciona em documentos e retorna um documento, você pode encadea-los assim:
Mas não seja bobo, como eu, e tente fazer isso:
Lembre-se: Document.prototype.populate () retorna um documento, então isso é um absurdo. Se você quer uma promessa, você precisa ...
Document.prototype.execPopulate ()
Veja a documentação completa.
Este trabalha em documentos MAS retorna uma promessa que resolve o documento. Em outras palavras, você pode usá-lo assim:
Isso é melhor. Finalmente, há ...
Model.populate ()
Veja a documentação completa.
Este funciona em modelos e retorna uma promessa. Portanto, é usado de maneira um pouco diferente:
Espero que tenha ajudado alguns outros recém-chegados.
fonte
Infelizmente, este é um problema de longa data com o mangusto que acredito ainda não foi resolvido:
https://github.com/LearnBoost/mongoose/issues/570
O que você pode fazer é escrever seu próprio getter / setter personalizado (e definir real
_customer
em uma propriedade separada) para isso. Por exemplo:NOTA: Eu não testei e pode funcionar estranhamente com
.populate
e ao definir o id puro.fonte
Mongoose 5.2.7
Isso funciona para mim (apenas muita dor de cabeça!)
fonte
Provavelmente sth. gostar
Seria a maneira mais agradável e menos problemática de fazer isso funcionar (usando promessas do Bluebird).
fonte
acabou escrevendo algumas funções Promise habilitadas para curry, onde você declara seu schema, query_adapter, data_adapter funções e preenche string com antecedência. Para uma implementação mais curta / simples, mais fácil.
Provavelmente não é muito eficiente, mas achei a parte de execução bem elegante.
arquivo github: curry_Promises.js
declaração
execução
fonte