【问题标题】:Mongoose display with relationships猫鼬展示与关系
【发布时间】:2016-11-15 21:29:13
【问题描述】:

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

案例:id、主题、描述

合作伙伴:id、姓名、地址

casepartners:case,partner,createdAt

我想列出所有案例,同时为每个案例显示案例 ID 相同的 casepartners 记录。

我正在使用此代码:

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'
    }
});

有人可以帮忙吗?

【问题讨论】:

    标签: node.js mongoose mean-stack meanjs


    【解决方案1】:

    如果可能,我建议重新定义您的集合(表),因为拥有 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 架构设计的更多信息。

    【讨论】:

    • 这似乎是最好的方法。
    • 在这种情况下 .find() 会是什么样子?目前它只显示所有情况,但肯定应该有某种 where stm here?
    【解决方案2】:

    试试mongoose-reverse-populate。在 mongoose 中有一种称为填充的方法,但是当您第一次搜索 caseparters 和填充案例类型时,它可以帮助您。但是你想要的恰恰相反。

    【讨论】:

    • 如果您喜欢这个答案,请接受它,而不仅仅是投票。!!
    • 我还没有测试过这是否有效,让我们检查一下,如果有效,我会接受你的回答...
    猜你喜欢
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2023-03-19
    • 2017-03-31
    • 2014-02-23
    • 2018-01-22
    • 2018-08-23
    相关资源
    最近更新 更多