1

正在检查 Mongoose 和相对较新的填充方法。当从孩子填充到父母时,似乎工作完美,如下所示:

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 是可见的,无需在用户模型/模式上调用 populate,而且我可以从子侧 ref 很好地填充这一事实,这使得配置看起来是正确的,但并不快乐。

上述模式被缩短,以免发布一英里长的代码列表(我讨厌那个!!!)。希望我错过了一些简单的东西。

4

1 回答 1

1

好的,解决了这个问题。不幸的是,这就像许多事情一样,文档并不总是一清二楚。为了在两个方向上使用“填充”。作为子到父和相反的父到子,你必须仍然将你的子项推送到父数组。这些当然是文档,而不是关系数据库,所以基本上填充是伪关系关系,或者至少我是这么看的,所以尽管我正确配置了组件,但我最初的顺序是不正确的。归根结底,它并不太复杂,我只需要从逻辑上考虑即可。所以你来找下一个乔...

注意:我最初的问题的查找方法是正确的,它是最初保存到数据库的不准确并导致父子人口。

 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' });
          }
      });             
    });             
 });                
于 2013-05-29T18:57:09.400 回答