1

私は2つのスキーマを持っています:

var categorySchema = mongoose.Schema({
    title: String,
    blogs: [{ type: ObjectId, ref: 'Blog' }]
})

var blogSchema = mongoose.Schema({
    title: String,
    description: String,
    category: [{ type: ObjectId, ref: 'Category' }],
    created: {type: Number, default: new Date().getTime()}
})

var Category = mongoose.model('Category', categorySchema)
var Blog = mongoose.model('Blog', blogSchema)

それらは相互参照しています:

  1. Categoryブログ オブジェクトには、このブログが関連するすべてのカテゴリを取得できるオブジェクト (参照)の配列が含まれています。
  2. Blogカテゴリ オブジェクトには、このカテゴリのすべてのブログを取得できるようにするためのオブジェクト (参照) の配列が含まれています。

問題は、特定のブログを取得しようとするときです。タイトルを取得するには、カテゴリ配列を設定する必要があります。

Blog
    .findOne({_id: _._id})
    .populate('category')
    .exec(function (err, __) {
        callback(err, __);
    })

私は...

{ title: 'My Blog',
  description: 'description',,
  _id: 51cb6bd845ba145e02000001,
  __v: 0,
  created: 1372285906662,
  category: 
   [ { __v: 0,
       _id: 51cb5ed6fd63867905000002,
       priority: 3,
       title: 'Music',
       blogs: [Object] } ],
}

はい、カテゴリのタイトルを取得しますが、ブログのオブジェクトもいくつか取得します。それらにもデータが取り込まれています。しかし、ブログオブジェクトには多くのサブオブジェクト (投稿) が含まれる場合があり、覚えているようにcategoryfield . したがって、カテゴリ フィールドのすべてのオブジェクトは再帰的に入力され、ブログとカテゴリの間に相互リンクがあるため、ループで入力されますか?

人口レベルを制限するには?Blog/category[n]/blogs: []にデータを入力したくありませんcategory。. titleありがとう。

4

1 に答える 1

2

マングースのドキュメントから:

2 組のポインタが同期しなくなる可能性があるため、本当に 2 つのポインタ セットが必要かどうかについては議論の余地があります。代わりに、入力をスキップして、関心のあるストーリーを直接 find() することができます。

カテゴリ スキーマでブログの参照を削除し、関心のあるドキュメントをクエリするだけです。

"ブログ オブジェクトには、このブログが関連するすべてのカテゴリを取得できるように、カテゴリ オブジェクト (参照) の配列が含まれています":

Blog.findOne({_id: blogId})
    .populate('category')
    .exec(function (err, blog) {
        callback(err, blog);
        //blog.category is the array you want
    })

「Category オブジェクトには、このカテゴリのすべてのブログを取得できるようにするための Blog オブジェクト (参照) の配列が含まれています」:

Blog.find({category: catId}) 
    .exec(function (err, blogs) {
        callback(err, blogs);                        
    })

これは、指定された ID をカテゴリの配列内で実際に検索する$all クエリの単純化された構文です。

于 2013-06-27T02:37:49.340 に答える