我有一个以下结构的架构,用户可以在其中对内容的幸福程度进行投票。现在,我们需要知道用户投票选择的幸福等级。
简单的解决方案是取回文档,然后遍历每个数组并找到与用户对应的投票所在的位置,尽管这不是很理想。
const VoteSchema = new mongoose.Schema({
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
});
const DocumentSchema = new mongoose.Schema({
createdBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
text: String,
happiness: {
'-2': [VoteSchema],
'-1': [VoteSchema],
'0': [VoteSchema],
'1': [VoteSchema],
'2': [VoteSchema]
}
}, {
timestamps: true,
});
我也尝试了以下方法,但是对象(CoreMongooseArray)上似乎没有find()
函数:
const doc = await Document.findOne({ _id: id }).populate('createdBy');
doc.happiness['-1'].find({ user: userId })
理想情况下,我会寻找一种查询方法,并创建一个“虚拟”字段“ myHappinessVote”,但是我不确定该怎么做。
任何人都可以在不更改架构的情况下提出解决此问题的方法吗?
答案 0 :(得分:0)
经过讨论和分析,即使我们本来不想这样做,更改模式也是要走的路,特别是在考虑最大对象大小时。这还具有简化查询和使逻辑更易于理解的好处。
我们最终创建了以下形式的模式:
const DocumentVoteSchema = new mongoose.Schema({
document: { type: mongoose.Schema.Types.ObjectId, ref: 'Document' },
voteBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
happiness: Number
}, {
timestamps: true,
});
这允许以下形式的搜索查询:
const docs = await DocumentVote.find({ happiness: value }).populate('voteBy');
const docs = await DocumentVote.find({ document: docId }).populate('voteBy');