2013-05-28 3 views
1

Проверял Mongoose и относительно новый метод заполнения. Кажется, что он отлично работает при заполнении от ребенка до родителя следующим образом:Mongoose Populate Child ref возвращает нулевой массив

var Comment = new Schema({ 
    Message: { type: String } 
    User: { type: ObjectId, ref: 'User' } 
}); 
var User = new Schema({ 
    Username: { type: String } 
    Comments: [{ type: ObjectId, ref: 'Comment' }] 
}); 

Следующие работы, как ожидалось.

Comment.find({}).populate({ path: 'User' }).exec(function (err, comments) { 
    if(err) handle(callback); 
    // no error do something with comments/user. 
    // this works fine and populates the user perfectly for each comment. 
}); 

User.findOne({ Username: "some username"}).populate('Comments').exec(function (err, user) { 
    if(err) handle(callback); 
    // this throws no errors however the Comments array is null. 
    // if I call this without populate I can see the ref ObjectIds in the array. 
}); 

Тот факт, что ObjectIds видны без вызова заселить на модели пользователя/схемы и тот факт, что я могу заселить просто отлично от бокового ребенка исх делает вид, что конфигурация не правильна пока нет радости.

Вышеупомянутые схемы были закорочены так, чтобы не опубликовать длинный список кодов (мне это не нравится !!!). Надеюсь, я пропустил что-то простое.

+0

Вы пробовали некапитализировать название пути? Очень маловероятно, что это проблема, но заглавные имена путей не являются идиоматическими, и вполне возможно, что мангуста понижает их где-то как часть процесса нормализации. Просто хватайтесь за соломинку здесь, кроме того, ваш пример - учебник. – numbers1311407

+0

Что касается учебника, то это то, что я думаю, что оно заторможено. Должно быть, что-то глупое. Мне нравятся объекты/реквизиты, когда они представляют тип (.net парень так, как класс), чтобы быть кепкой, просто для согласованности. может быть прав. Я попробую другой случай по свойствам ref. Избавьтесь от этого. – origin1tech

+0

нет кубиков в нижнем регистре ... – origin1tech

ответ

1

O.K. разобрал это. К сожалению, это, как и многие другие, не всегда кристально чисты. Чтобы использовать «населить» в обоих направлениях. То, что это ребенок для родителей и наоборот Родитель для ребенка, вы ДОЛЖЕН по-прежнему толкать ваш дочерний элемент в родительский массив. Это, конечно, документы, а не реляционная база данных, поэтому, по сути, заполнение является псевдореляционным отношением или, по крайней мере, так я вижу это, хотя у меня были правильно настроены компоненты, которые были изначально неверны. В нижней части это было не слишком сложно, я просто должен был логически рассуждать об этом. Итак, здесь вы переходите к следующему joe ...

ПРИМЕЧАНИЕ. Методы поиска моего исходного вопроса верны, это было первоначальное спасение для db, которое было неточным и вызвало популяцию родителя к ребенку.

user.save(function (err) { 
    comment.User = user._id; 
    comment.save(function (err) { 
     user.Comments.push(comment); 
     user.save(function (err) { 
      if (err) {         
       res.json(400, { message: err + '' }); 
      } else { 
       res.json(200, { message: 'success' }); 
      } 
     });    
    });    
});     
Смежные вопросы