6

KeystoneJS でプロジェクトに取り組んでいますが、マングースの関係を少し理解するのに苦労しています。

keystone docs によると、次のモデルがあるとしましょう: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はマングースやクエリとは何の関係もありません。代わりに、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 } })

キーストーンのドキュメントを読んだ後、これはマングースの純粋な方法と論理的に同等のよう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);
};

User リストにメソッドを追加することで、MongoDB ドキュメントを関連付ける の配列をObjectIdPost ドキュメントに永続化する手間を省くことができます。これには 2 番目のクエリが必要であることはわかっていますが、これら 2 つのオプションのいずれかが最善の策のようです。

于 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 に答える