猫鼬在子文档中找到具有多个字段的条目?

时间:2019-05-14 22:27:36

标签: node.js mongoose

我有一个以下结构的架构,用户可以在其中对内容的幸福程度进行投票。现在,我们需要知道用户投票选择的幸福等级。

简单的解决方案是取回文档,然后遍历每个数组并找到与用户对应的投票所在的位置,尽管这不是很理想。

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”,但是我不确定该怎么做。

任何人都可以在不更改架构的情况下提出解决此问题的方法吗?

1 个答案:

答案 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');