如果第一个模型为空,如何填充第二个模型

时间:2017-01-09 07:32:19

标签: mongodb mongoose-populate

我有三个模特,

modelA,modelB和ModelC

ModelC的数据在这里

 ModelC.find({})
       .populate({ path: 'RefId', model: 'modelA' })
       .populate({ path: 'RefId', model: 'modelB' })

如何为ModelC编写填充查询,以填充 RefId

它应该填充 RefModel 引用的modelA或modelB。

我已经尝试了

new mongoose.Schema({
  RefModel: String,
  RefId:{ type: Schema.ObjectId}});

但只采用最后一种模式。

modelC架构。

x

我可以用聚合来做,但更喜欢填充。

2 个答案:

答案 0 :(得分:0)

数据库和架构中的字段名称非常混乱,让我解释一下更清晰的例子。

假设您有3个模型:用户,文章和评论。文章和评论仅属于单个用户。用户可以有多个评论和文章(如您在示例中所示)。

  1. (更有效率和推荐方式)。将评论和文章id存储在用户模型中,如:
  2. comments: [{ id: '..', ref: Comment }], articles: [{ id: '..', ref: Article }]

    并填充您的文档:

    User.find({})
        .populate('comments')
        .populate('articles');
    
    1. 将用户ID存储在评论和文章模型中,如
    2. user: { id: '...', ref: User }

      并使用mongoose-reverse-populate模块进行填充,例如注释模型:

      var reversePopulate = require('mongoose-reverse-populate');
      
      User.find().exec(function(err, users) {
      
          var opts = {
              modelArray: users,
              storeWhere: "comments",
              arrayPop: true,
              mongooseModel: Comments,
              idField: "user"
          }
      
          reversePopulate(opts, function(err, popUsers) {
              // populated users will be populated with comments under .comments property
          });
      });
      

      此外,您不需要将RefModel保留在数据库中,仅在模式中。

答案 1 :(得分:0)

在这里,你可以尝试在find本身的回调中填充它。

试试这个:

ModelC.find({}).exec(function(err,modelC){
    //find returns an array of Object, you will have to populate each Object individually.
    var modelCObjects =[];
    modelC.forEach(function(tempModelC){
        //populate via the Model
        ModelC.populate(tempModelC,{path : tempModelC.refId , model :tempModelC.refModel},function(err2,newModelC){
            //handle newModelC however you want
            //Push it into array of modelC Objects
            modelCObjects.push(newModelC);
        });


        //OR
        //Populate directly on the resultObject <-im not so sure about this
        tempModelC.populate({path : tempModelC.refId , model :tempModelC.refModel},function(err2,newModelC){
            //Push it into array of modelC Objects
            modelCObjects.push(newModelC);
        })
    });

    //here you have modelCObjects -> Array of populated modelC Objects
});

请务必处理错误。