mongoose:填充填充字段

我使用MongoDB作为我的应用程序的日志pipe理器,然后同步移动客户端。 我在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); 

当我想检索日志时,我使用以下代码:

 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); 

正如你所看到的,我想mongoose填充日志集合中的“uarticle”字段,然后,我想填充UserArticle(“uarticle”)的“文章”字段。

但是,使用此代码,Mongoose只使用UserArticle模型填充“uarticle”,而不填充uarticle内部的文章字段。

是否有可能使用Mongoose和populate()完成它,或者我应该做别的事情?

谢谢,

从我在文档中查到的内容以及从我听到的内容中可以看出,这是无法实现的,但是您可以在callback函数中自己填充“uarticle.article”文档。

不过,我想指出另一个我认为更重要的方面。 您在集合A中有参考集合B的文档,在集合B的文档中,您有另一个集合C中文档的引用。

你要么做错了(我指的是数据库结构),或者你应该在这里使用关系数据库,如MySQL。 MongoDB的能力依赖于你可以在文档中embedded更多信息的事实,因此不得不做更less的查询(把你的数据放在一个集合中)。 虽然引用某些东西是可以的,但是引用和引用其他引用似乎并没有在这里充分利用MongoDB的优势。

也许你想分享你的情况和数据库结构,所以我们可以帮助你更多。

你可以使用mongoose-deep-populate插件来做到这一点。 用法:

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

免责声明:我是插件的作者。

我面临同样的问题,但经过几个小时的努力,我find了解决办法。它可以不使用任何外部插件:)

  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); } 

怎么样的东西:

 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很粗糙…想要src?