私が理解している限り、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 ドキュメントを関連付ける の配列をObjectId
Post ドキュメントに永続化する手間を省くことができます。これには 2 番目のクエリが必要であることはわかっていますが、これら 2 つのオプションのいずれかが最善の策のようです。