No puedo completar manual o automáticamente el campo del creador en un objeto recién guardado ... la única forma en que puedo encontrar es volver a consultar los objetos que ya tengo y que odiaría hacer.
Esta es la configuración:
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);
Aquí es donde me estoy tirando del pelo
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: la última mangosta solucionó este problema y agregó la funcionalidad de poblar, vea la nueva respuesta aceptada.
creator.profile
En caso de que alguien todavía esté buscando esto.
Mongoose 3.6 ha introducido muchas características interesantes para completar:
o:
ver más en: https://github.com/LearnBoost/mongoose/wiki/3.6-Release-Notes#population
Pero de esta forma seguiría consultando al usuario nuevamente.
Un pequeño truco para lograrlo sin consultas adicionales sería:
fuente
book._creator = user;
después de quesave()
es la única respuesta correcta entre todas las respuestas actuales, todas las demás respuestas requieren una consulta adicional.La solución para mí fue usar
execPopulate
, asífuente
Solución que devuelve una promesa (sin devoluciones de llamada):
Usar documento # rellenar
Posible implementación
Lea sobre la población de documentos aquí .
fuente
Solo para elaborar y dar otro ejemplo, ya que me ayudó. Esto podría ayudar a quienes deseen recuperar objetos parcialmente poblados después de guardar. El método también es ligeramente diferente. Pasé más de una hora o dos buscando la forma correcta de hacerlo.
fuente
Pensé en agregar a esto para aclarar las cosas para los novatos como yo.
Lo que es enormemente confuso si no tiene cuidado es que hay tres métodos de poblado muy diferentes. Son métodos de diferentes objetos (Modelo vs. Documento), toman diferentes entradas y dan diferentes salidas (Documento vs. Promesa).
Aquí están para aquellos que están desconcertados:
Document.prototype.populate ()
Ver documentos completos.
Éste trabaja en documentos y devuelve un documento. En el ejemplo original, se vería así:
Debido a que funciona con documentos y devuelve un documento, puede encadenarlos de esta manera:
Pero no seas tonto, como yo, y trata de hacer esto:
Recuerde: Document.prototype.populate () devuelve un documento, así que esto es una tontería. Si quieres una promesa, necesitas ...
Document.prototype.execPopulate ()
Ver documentos completos.
Este funciona en documentos PERO devuelve una promesa que se resuelve en el documento. En otras palabras, puedes usarlo así:
Eso es mejor. Finalmente, hay ...
Model.populate ()
Ver documentos completos.
Este funciona en modelos y devuelve una promesa. Por lo tanto, se usa de manera un poco diferente:
Espero que haya ayudado a otros recién llegados.
fuente
Desafortunadamente, este es un problema de larga data con la mangosta que creo que aún no está resuelto:
https://github.com/LearnBoost/mongoose/issues/570
Lo que puede hacer es escribir su propio getter / setter personalizado (y establecer real
_customer
en una propiedad separada) para esto. Por ejemplo:NOTA: No lo probé y podría funcionar de manera extraña con
.populate
y al configurar ID puro.fuente
Mangosta 5.2.7
Esto funciona para mí (¡solo un montón de dolor de cabeza!)
fuente
Probablemente algo. me gusta
Sería la forma más agradable y menos problemática de hacer que esto funcione (usando las promesas de Bluebird).
fuente
terminó escribiendo algunas funciones de Promise aptas para curry donde declara su esquema, query_adapter, funciones de data_adapter y completa la cadena de antemano. Para una implementación más corta / simple más fácil.
Probablemente no sea muy eficiente, pero pensé que la parte de ejecución fue bastante elegante.
archivo github : curry_Promises.js
declaracion
ejecución
fuente