据我了解,keystone 的List Relationship与 mongoose 和查询无关。相反,keystone 的管理 UI 使用它来构建关系查询,然后在视图中呈现它们。这就是说我会忘记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 pure 方式,User.schema.add({ posts: [{ type: Schema.Types.ObjectId, ref: 'Post' }] });
. 现在您正在维护两个列表上的关系。相反,您可能希望将一个方法添加到您的梯形校正列表中。
User.schema.methods.posts = function(done){
return keystone.list('Post').model.find()
.where('author', this.id )
.exec(done);
};
通过向您的用户列表添加一个方法,它使您免于将ObjectId
s 数组与 MongoDB 文档关联回 Post 文档。我知道这需要第二次查询,但是这两个选项之一看起来是您最好的选择。