在 KeystoneJS 中处理一个项目时,我在弄清楚 mongoose 关系位时遇到了麻烦。
根据 keystone 文档,假设我们有以下模型:User
和 Post
。现在帖子与用户有关系,所以我会写:
Post.add({
author: { type: Types.Relationship, ref: 'User' }
});
然后:
User.relationship({ path: 'posts', ref: 'Post', refPath: 'author' });
现在,我希望能够查看与该用户相关的所有帖子,而不必查询用户 和 帖子。例如,如果我查询一个用户对象,我希望能够执行 user.posts
并访问那些相关的帖子。你能用 mongoose/keystone 做到这一点吗?
最佳答案
据我了解,keystone 的 List Relationship与 Mongoose 和查询无关。相反,keystone 的管理 UI 使用它来构建关系查询,然后再将它们呈现在 View 中。这表示我会忘记 User.relationship(...);
解决您的问题,尽管您想要它是为了我刚才提到的。
根据您的架构,以下内容应该可以正常工作,但只会填充one
端的关系:
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 希望将此定义添加到 Schema .通过将此行包含在您的用户列表文件中来添加此关系:
User.schema.add({ posts: { type: Types.Relationship, ref: 'Post', many: true } })
阅读 keystone 文档后,这似乎在逻辑上等同于 mongoose 纯方式,User.schema.add({ posts: [{ type: Schema.Types.ObjectId, ref: 'Post' }] } );
。现在您正在维护两个列表中的关系。相反,您可能想要添加 method到您的 keystone 列表。
User.schema.methods.posts = function(done){
return keystone.list('Post').model.find()
.where('author', this.id )
.exec(done);
};
通过向您的用户列表添加一个方法,它使您不必将 MongoDB 文档关联回 Post 文档的 ObjectId
数组持久化。我知道这需要第二次查询,但这两个选项之一看起来是您最好的选择。
关于node.js - 在 keystone 中获取相关项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24186357/