猫鼬显示与关系

Mongoose display with relationships

我有三个表 'cases'、'partners' 和 'casepartners',结构如下:

cases: id,subject,description

partners: id,name,address

casepartners:case,partner,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'
    }
});

有人可以帮忙吗?

尝试mongoose-reverse-populate。在 mongoose 中有一种称为 populate 的方法,但是当您第一次搜索 caseparters 和 populate case types 时,它会帮助您。但是你想要的是相反的。

如果可能的话,我会建议重新定义您的集合(表),因为拥有 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);
    }
  });

查看 this 了解更多关于 MongoDB 架构设计的信息。