Mongoose Populate Child ref 返回空数组

Posted

技术标签:

【中文标题】Mongoose Populate Child ref 返回空数组【英文标题】:Mongoose Populate Child ref returns null array 【发布时间】:2013-05-22 21:20:26 【问题描述】:

正在检查 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 很好地填充这一事实,这使得配置看起来是正确的,但并不快乐。

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

【问题讨论】:

您是否尝试过将路径名取消大写?这不太可能是问题,但大写的路径名称不是惯用的,并且作为规范化过程的一部分,猫鼬可能在某处将它们小写。只是在这里抓住稻草,除此之外,你的例子是教科书。 至于教科书,我认为这是迟钝的。一定是一些愚蠢的东西。我喜欢对象/道具,当它们代表一种类型(.net 家伙,就像一个类)是上限时,只是为了一致性。想知道你是否是对的。我会在 ref 属性上尝试不同的情况。不过,我在这方面打我的头。 小写没有骰子... 【参考方案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' );
          
      );             
    );             
 );                

【讨论】:

以上是关于Mongoose Populate Child ref 返回空数组的主要内容,如果未能解决你的问题,请参考以下文章

mongoose.populate() 未显示填充内容

Mongoose .populate 随机

Mongoose .populate() 不填充

19-3-18 mongoose 连表查询populate用法

Model.populate() 不是 Mongoose 中的返回文档

Mongoose - 使用 .populate 访问嵌套对象