Mongoose更新条件匹配错误的对象

模型模式

const PollSchema = new Schema({ title: { type: String, trim: true, required: true }, choices: [ { title: { type: String, trim: true, required: true }, votes: { type: Number, default: 0, min: 0 }, } ], date: { type: Date, default: Date.now }, url: { type: String, required: true, unique: true }, }) 

更新电话

 async vote (pollId, choiceId, unvoteId = '') { try { await pollModel.update( { '_id': pollId, 'choices._id': choiceId }, { $inc: { 'choices.$.votes': 1 } }, ) if (unvoteId) { await pollModel.update( { "$and": [ { '_id': pollId }, { 'choices._id': unvoteId }, { 'choices.votes': { $gt: 0 } } ], }, { $inc: { 'choices.$.votes': -1 } }, ) } return await pollModel.findById(pollId) } catch (e) { throw new ApiError( 500, 'Error: Poll:Vote', e ) } } 

我一直在尝试大量的组合试图让这个工作。 投票+1按预期工作,但在尝试-1时,查询条件未正确匹配。 我已经试过$and $elemMatch ,这三个条件的普通对象(根据文档,这是足够的,也隐含地意味着也是。

每当我通过一个unvoteId发送,无论我在数组中select哪个_id ,它总是会匹配具有$gt 0票的FIRST元素。 就好像choices._id被完全忽略了一样,只要它满足了0票的select,它就返回$位置参数。

这是打算? 我假设$and只有满足3个条件才能匹配。

我想要做的是使用$incprimefaces更新投票,同时也确保当有人投票,他们不能把值低于0.由于mongoosevalidation程序不会在更新期间运行,我试图通过validation查询自己。

尝试这样的事情。

 pollModel.update({ _id: pollId, choices: { $elemMatch: { _id: unvoteId, votes: { $gt: 0 } } } }, { $inc: { "choices.$.votes": -1 } })