找到后确定鉴别器类型的正确方法

时间:2018-07-09 09:51:40

标签: node.js mongoose mongoose-schema

我想使用正确的猫鼬模型来表示包含多个鉴别符的文档。

说我有以下模型:

@Column(name = "from_user_id")
private Long fromUserId;

@Column(name = "to_user_id")
private Long toUserId;

当我const membershipSchema = mongoose.Schema({ name: { type: String, required: true }, course: { type: mongoose.Schema.Types.ObjectId, ref: 'Course' }, price: { type: Number, required: true, get: p => `£${p}.00` } }, { discriminatorKey: 'type' }); const subscriptionSchema = mongoose.Schema({ frequency: { type: String, enum: [ 'week' , 'month' ], required: true, get: val => `${val}ly subscription` } }) const ticketSchema = mongoose.Schema({ frequency: { type: String, default: 'one-off' } }); const Membership = mongoose.model('Membership', membershipSchema); const Subscription = Membership.discriminator('Subscription', subscriptionSchema); const Ticket = Membership.discriminator('Ticket', ticketSchema); module.exports = { Membership, Ticket, Subscription }; 一组.find时,我事先不知道它们是memberships还是ticket s。

我目前正在这样做,以查找特定用户的订阅:

subscription

但是 const { Membership, Subscription, Ticket } = require('./membership'); return Membership.find({ user: this._id }); 模型没有正确的getter,它们在鉴别符MembershipSubscription上指定。

我知道我有Ticket键来告诉我特定文档是订购还是票据。

但是用正确的模型表示每个文档的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

我已经通过困难的方式解决了这个问题,但是不能是正确的方法。在没有任何文档帮助的情况下,这种方法必须要做:

  const { Subscription, Ticket } = require('./membership');
  return Promise.all([
    // Find each type of discriminator in turn
    Subscription.find({ course: this._id }),
    Ticket.find({ course: this._id }),
  ]).then(membershipArray =>
    // Combine the resulting arrays into a single result array
    membershipArray.reduce((combined, array) => combined.concat(array), [])
  );

欢迎改进/建议。


更新

猫鼬API使model.discriminators可用,尽管似乎完全没有记录。

我们可以使用它为使用find()的每个鉴别符调用map

const discriminators = Membership.discriminators;

return Promise.all(Object.keys(discriminators).map(i => discriminators[i].find({ course: this._id }))
).then(promiseResults =>
  promiseResults.reduce((arr, el) => arr.concat(el), [])
);

这是每次获取正确鉴别符的一种非常简单的方法,前提是您没有针对父模型存储任何文档。

如果是这样,在运行discriminators行之前将父模型附加到Promise.all对象是相当简单的。