node.js - 在 keystone 中获取相关项目

标签 node.js mongoose keystonejs

在 KeystoneJS 中处理一个项目时,我在弄清楚 mongoose 关系位时遇到了麻烦。

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

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/

相关文章:

javascript - 在 Nodejs 与 Redis 哈希中使用全局对象

angularjs - 找不到模块 'express';找不到名称 'process' ;等等

javascript - 使用 Mongodb 聚合如何将数字更改为月份名称

javascript - 失败 $ grunt buildcontrol :pages jit-grunt Not Found

javascript - MERN 堆栈 : How to prevent a User from registering (being added to an array) multiple times?

javascript - 安装并运行 keystone.js 后,什么可能导致此错误?

javascript - Handlebars 表情

node.js - 在 Digital Ocean 上部署新的 node.js keystoneJS 应用程序

node.js - Mongoose 复杂(异步)虚拟

javascript - 使用 console.log 时如何隐藏对象上的某些键