我想使用正确的猫鼬模型来表示包含多个鉴别符的文档。
说我有以下模型:
@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,它们在鉴别符Membership
和Subscription
上指定。
我知道我有Ticket
键来告诉我特定文档是订购还是票据。
但是用正确的模型表示每个文档的正确方法是什么?
答案 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
对象是相当简单的。