获取keystone中的相关项目

在KeystoneJS的一个项目上工作,我很难搞清楚mongoose的关系。

根据keystone文档,假设我们有以下模型: UserPost 。 现在一个post与用户有关系,所以我会写:

 Post.add({ author: { type: Types.Relationship, ref: 'User' } }); 

接着:

 User.relationship({ path: 'posts', ref: 'Post', refPath: 'author' }); 

现在,我希望能够查看与该用户相关的所有post,而不必同时查询用户post。 例如,如果我查询用户对象,我希望能够做user.posts并有权访问这些相关的职位。 你可以用mongoose/基石做这个吗?

据我所知,keystone的List关系与mongoose和查询无关。 相反,keystone的pipe理用户界面使用它来构build关系查询,然后将它们呈现在视图中。 这说我会忘记User.relationship(...); 解决你的问题,虽然你想为我刚刚提到的。

以下应该根据您的模式正常工作,但只填充一方的关系:

 var keystone = require('keystone'); keystone.list('Post').model.findOne().populate('author', function (err, doc) { console.log(doc.author.name); // Joe console.log(doc.populated('author')); // '1234af9876b024c680d111a1' -> _id }); 

你也可以尝试另一种方式,但是…

 keystone.list('User').model.findOne().populate('posts', function (err, doc) { doc.posts.forEach(function (post) { console.log(post); }); }); 

…mongoose期望这个定义被添加到模式 。 这个关系是通过在你的用户列表文件中包含这一行来添加的:

 User.schema.add({ posts: { type: Types.Relationship, ref: 'Post', many: true } }) 

在阅读keystone docs之后,这似乎是在逻辑上相当于mongoose的纯方式, User.schema.add({ posts: [{ type: Schema.Types.ObjectId, ref: 'Post' }] }); 。 现在你现在正在维护这两个名单上的关系。 相反,你可能想要添加一个方法到你的keystone列表中。

 User.schema.methods.posts = function(done){ return keystone.list('Post').model.find() .where('author', this.id ) .exec(done); }; 

通过在您的用户列表中添加一个方法, ObjectId将与MongoDB文档相关的ObjectId数组持久化回Post文档。 我知道这需要第二个查询,但这两个选项之一看起来是你最好的select。

我发现这在他们的github上https://github.com/Automattic/mongoose/issues/1888 ,检查它的上下文,但基本上说使用keystone populateRelated()方法。 我testing了它,确实工作

 // if you've got a single document you want to populate a relationship on, it's neater Category.model.findOne().exec(function(err, category) { category.populateRelated('posts', function(err) { // posts is populated }); }); 

我知道这个问题是古老的,但必须在那里作进一步的参考