猫鼬显示与关系

时间:2016-07-13 10:33:22

标签: node.js mongoose mean-stack meanjs

我有三张桌子' case','合作伙伴'和' casepartners'具有以下结构:

  

案例:id,subject,description

     

合作伙伴:ID,姓名,地址

     

casepartners :情况下,合伙人,createdAt

我想列出所有案例,并列出每个案例,casepartners记录案例ID的相同位置。

我正在使用此代码:

Case.find().sort('-created').exec(function (err, cases) {
        if (err) {
            return res.status(400).send({
                message: errorHandler.getErrorMessage(err)
            });
        } else {
            res.json(cases);
        }
    });

它显示所有案例都很好,但我还想为每个案例对象显示该案例ID的 casepartners 列表...

让我们说一些合作伙伴订阅了相同的案例,我想列出所有这些合作伙伴,或者只计算有多少合作伙伴订阅了这个案例。

我正在使用Angularjs列出所有使用ng-repeat的情况但如果我必须单独调用以在ng-repeat中显示每个案例的casepartners记录或者通过使用某些函数将其附加到同一函数中,我会感到困惑一种.populate()或其他与实体关系的东西。

这些是定义的模型:

var CaseSchema = new Schema({
    subject: {
        type: String,
        default: '',
        trim: true,
        required: 'Subject cannot be blank'
    },
    description: {
        type: String,
        default: '',
        trim: true
    },
    created: {
        type: Date,
        default: Date.now
    },
    customer: {
        type: Schema.ObjectId,
        ref: 'Customer'
    },
    category: {
        type: Schema.ObjectId,
        ref: 'Category'
    }
});

var CasePartnerSchema = new Schema({
    case: {
        type: Schema.ObjectId,
        ref: 'Case'
    },
    partner: {
        type: Schema.ObjectId,
        ref: 'Partner'
    },
    created: {
        type: Date,
        default: Date.now
    }
});

var PartnerSchema = new Schema({
    name: {
        type: String,
        trim: true,
        default: ''
    },
    created: {
        type: Date,
        default: Date.now
    },
    user: {
        type: Schema.ObjectId,
        ref: 'User'
    }
});

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

尝试mongoose-reverse-populate。在mongoose中有一种叫做populate的方法,但是当你第一次搜索caseparters并填充案例类型时,它会帮助你。然而你想要的却与此相反。

答案 1 :(得分:1)

如果可能,我会建议重新定义您的集合(表格),因为CasePartner集合有点多余。

我建议你只有一个案例集合,然后在该集合中有一组合作伙伴,而不是case和casePartner集合。

您的架构将如下所示:

var CaseSchema = new Schema({
    partners: [{
        type: mongoose.Schema.Types.ObjectId, 
        ref: 'Partner'
    }],
    subject: {
        type: String,
        default: '',
        trim: true,
        required: 'Subject cannot be blank'
    },
    description: {
        type: String,
        default: '',
        trim: true
    },
    created: {
        type: Date,
        default: Date.now
    },
    customer: {
        type: Schema.ObjectId,
        ref: 'Customer'
    },
    category: {
        type: Schema.ObjectId,
        ref: 'Category'
    }
});

您的查找将如下所示:

Case
  .find({})
  .sort('-created')
  //.populate() populates all info from the partnersSchema for each partner
  .populate('partners')
  .exec(function(err, cases) {
    if (err) {
      return res.status(400).send({
        message: errorHandler.getErrorMessage(err)
      });
    } else {
      res.json(cases);
    }
  });

有关MongoDB架构设计的更多信息,请查看this