sort inner fields array after mongodb node.js mongoose populate

mongodb - inner - mongoose populate subdocument



Mangosta: rellenar un campo poblado (4)

Estoy usando MongoDB como un guardián de registro para mi aplicación para luego sincronizar clientes móviles. Tengo estos modelos configurados en NodeJS:

var UserArticle = new Schema({ date: { type: Number, default: Math.round((new Date()).getTime() / 1000) }, //Timestamp! user: [{type: Schema.ObjectId, ref: "User"}], article: [{type: Schema.ObjectId, ref: "Article"}], place: Number, read: Number, starred: Number, source: String }); mongoose.model("UserArticle",UserArticle); var Log = new Schema({ user: [{type: Schema.ObjectId, ref: "User"}], action: Number, // O => Insert, 1 => Update, 2 => Delete uarticle: [{type: Schema.ObjectId, ref: "UserArticle"}], timestamp: { type: Number, default: Math.round((new Date()).getTime() / 1000) } }); mongoose.model("Log",Log);

Cuando quiero recuperar el registro, uso el siguiente código:

var log = mongoose.model(''Log''); log .where("user", req.session.user) .desc("timestamp") .populate("uarticle") .populate("uarticle.article") .run(function (err, articles) { if (err) { console.log(err); res.send(500); return; } res.json(articles);

Como puede ver, quiero que la mangosta rellene el campo "uarticle" de la recopilación de registros y, a continuación, quiero rellenar el campo "artículo" del UserArticle ("uarticle").

Pero, al usar este código, Mongoose solo llena "uarticle" usando el UserArticle Model, pero no el campo del artículo dentro de uarticle.

¿Es posible lograrlo utilizando Mongoose y poblar () o debo hacer otra cosa?

Gracias,


¿qué tal algo como:

populate_deep = function(type, instance, complete, seen) { if (!seen) seen = {}; if (seen[instance._id]) { complete(); return; } seen[instance._id] = true; // use meta util to get all "references" from the schema var refs = meta.get_references(meta.schema(type)); if (!refs) { complete(); return; } var opts = []; for (var i=0; i<refs.length; i++) opts.push({path: refs[i].name, model: refs[i].ref}); mongoose.model(type).populate(instance, opts, function(err,o){ utils.forEach(refs, function (ref, next) { if (ref.is_array) utils.forEach(o[ref.name], function (v, lnext) { populate_deep(ref.ref_type, v, lnext, seen); }, next); else populate_deep(ref.ref_type, o[ref.name], next, seen); }, complete); }); }

meta utils es rudo ... quieres el src?


Me enfrenté al mismo problema, pero después de horas de esfuerzos, encontré la solución. Puede ser sin utilizar ningún complemento externo :)

applicantListToExport: function (query, callback) { this .find(query).select({''advtId'': 0}) .populate({ path: ''influId'', model: ''influencer'', select: { ''_id'': 1,''user'':1}, populate: { path: ''userid'', model: ''User'' } }) .populate(''campaignId'',{''campaignTitle'':1}) .exec(callback); }


Por lo que he comprobado en la documentación y por lo que escucho de usted, esto no se puede lograr, pero puede rellenar los documentos "uarticle.article" en la función de devolución de llamada.

Sin embargo quiero señalar otro aspecto que considero más importante. Tiene documentos en la colección A que hacen referencia a la colección B, y en los documentos de la colección B tiene otra referencia a los documentos en la colección C.

O estás haciendo esto mal (me refiero a la estructura de la base de datos), o deberías usar una base de datos relacional como MySQL aquí. El poder de MongoDB se basa en el hecho de que puede incrustar más información en los documentos, por lo que tiene que hacer menos consultas (tener sus datos en una sola colección). Mientras que hacer referencia a algo está bien, tener una referencia y luego otra referencia no parece que estés aprovechando al máximo MongoDB aquí.

Tal vez le gustaría compartir su situación y la estructura de la base de datos para que podamos ayudarlo más.


Puede usar el complemento de mongoose-deep-populate para hacer esto. Uso:

User.find({}, function (err, users) { User.deepPopulate(users, ''uarticle.article'', function (err, users) { // now each user document includes uarticle and each uarticle includes article }) })

Descargo de responsabilidad: Soy el autor del plugin.