2013-06-26 2 views
1

У меня есть две схемы:Mongoose - как ограничить глубину заселения() уровня?

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 (refs), чтобы иметь возможность получить все блоги этой категории.

Проблема в том, когда я пытаюсь получить определенный Блог. Мне нужно, чтобы заполнить массив категорий, чтобы получить его названия:

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] } ], 
} 

Да, я получаю категории названия, но я также получить некоторые объекты в блогах - они были заселены , Но блога-объекты могут содержать много подобъектов (должностей) и, как мы помним, category Поле. Итак, все объекты в поле категории будут заполнены рекурсивно, и поскольку у меня есть перекрестные ссылки между блоком и категорией, он будет заполняться в цикле?

Как ограничить уровень населения? Я не хочу, чтобы блог/категория [n]/blogs: [] был заполнен, только прямые category поля, такие как title. Благодарю.

ответ

2

От mongoose docs:

Это спорно, что мы действительно хотим, два набора указателей, поскольку они могут рассинхронизации. Вместо того, чтобы мы могли пропустить заполнение и непосредственно найти() истории, которые мы заинтересованы в.

Я хотел бы удалить ссылку из блогов в категории схемы и только запрашивать документы, которые вас интересуют.

«объект Блог содержит массив Категория объектов (ссылки), чтобы быть в состоянии получить все категории относится этот блог на»:

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

«объект Категория содержит массив объектов Дневник (ссылки) чтобы быть в состоянии получить все блоги этой категории ":

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

Это упрощенный синтаксис $all query, который фактически выполняет поиск внутри массива категорий для указанного идентификатора.