【问题标题】:Automatically populate() on Mongoose document fetch在 Mongoose 文档获取上自动填充()
【发布时间】:2015-08-10 13:07:59
【问题描述】:

是否可以为特定模型的引用子文档自动运行 populate()?

我有一个引用了 Region 和 Country 文档的 City 模型,我希望在获取一个或多个城市时自动填充这些文档。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    嗯,Mongoose 网站上没有这方面的文档;我所做的是这样的:

    schema.statics.createQuery = function( populates ) {
       var query = this.find();
       populates.forEach(function( p ) {
           query.populate( p );
       });
    
       return query;
    };
    

    当然,此方法中包含验证和其他一些内容,但本质上这是我对模型所做的。

    在您的情况下,如果您在每次 find 调用中都严格需要它们,您可以用这种方法对填充进行硬编码。

    【讨论】:

    • 这绝对是一种有趣的方法,并且适用于顶级查找,我很好奇是否有一种方法适用于嵌套引用获取。例如,我还有一个名为 Business 的模型,它有一个地址字段和一个对 City 的引用。我也希望这样,当获取企业时,它会自动填充城市,而城市又会自动填充原始问题中的地区和国家。
    • 我还没有很好地测试它,但是你可以做的是在你拥有它们之后在每个文档实例上调用populate()。但请注意,这可能比您真正需要的要贵。
    • 我喜欢 MongoDB、Mongoose 和 Node.js,但这里似乎没有很多额外的查询?我以前做过很多 MySQL,只是发生了一次连接和一次往返。我希望 MongoDB 可以在内部做一些事情来解决这个问题。
    • 让我们看看,但是从 v2.4 开始还没有这样的东西。
    【解决方案2】:

    AFAIK 无法自动填充对其他模型的所有引用(尽管有插件)。以与@gustavohenke 的答案类似的方式,您可以使用静态,并对您的查找查询进行少量更改。

    这是我要做的:

    citySchema.statics.fieldsToPopulate = function() {
       return ['regionField', 'countryField'];
    };
    

    其中regionFieldcountryField 是分别引用模型RegionCountry 的字段。

    然后在您的查询中,您可以相应地填充:

    var populate = city.fieldsToPopulate ? city.fieldsToPopulate() : [];
    
    city.findById(id)
       .populate(populate)
       .exec(function(err, data) {
          if (err) {
            return next(err);
          } else {
            res.render('template', { city: data });
          }
        });
    

    【讨论】:

      猜你喜欢
      • 2014-08-06
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2014-08-16
      • 2017-03-21
      • 2017-06-06
      相关资源
      最近更新 更多