6

在 KeystoneJS 中进行项目时,我无法弄清楚猫鼬关系位。

根据 keystone 文档,假设我们有以下模型:UserPost. 现在帖子与用户有关系,所以我会写:

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

接着:

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

现在,我希望能够查看与该用户相关的所有帖子,而无需同时查询用户帖子。例如,如果我查询一个用户对象,我希望能够user.posts访问这些相关的帖子。你能用猫鼬/梯形石做到这一点吗?

4

2 回答 2

4

据我了解,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);
};

通过向您的用户列表添加一个方法,它使您免于将ObjectIds 数组与 MongoDB 文档关联回 Post 文档。我知道这需要第二次查询,但是这两个选项之一看起来是您最好的选择。

于 2014-06-16T23:10:41.670 回答
0

我在他们的 github https://github.com/Automattic/mongoose/issues/1888上找到了这个,检查它的上下文,但基本上说要使用 keystone populateRelated() 方法。我测试了它并且确实有效

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

我知道这个问题很老,但这必须在那里供进一步参考

于 2016-03-29T02:38:03.493 回答