我有一个基本的猫鼬模型,其属性instruments
代表一个数组。因此,它包含多个项目,每个项目都具有以下属性:name
,counter
。该文档本身具有自动生成的_id
类型ObjectID
。
模型
var ParticipationSchema = new Schema({
instruments: [{
name: String,
counter: Number
}],
// etc.
},
{
timestamps: true
});
我现在想要更改instruments
数组中的1个项目,只要它符合以下要求:
58f3c77d789330486ccadf40
instruments
- 项name
必须等于'instrument-1'
instrument
- 项counter
必须低于3
查询
let someId = '58f3c77d789330486ccadf40';
let instrumentName = 'instrument-1'
let counter = 3;
Participation.update(
{
$and: [
{ _id: mongoose.Types.ObjectId(someId) },
{ 'instruments.name': instrumentName },
{ 'instruments.counter': { $lt: counter } }
]},
{
$set: {
'instruments.$.currentcounter' : counter
}
},
(err, raw) => {
// ERROR HANDLING
}
});
假设我在instruments
- 属性中有3个条目:
"instruments": [
{
"name": "instrument-1",
"counter": 2
},
{
"name": "instrument-1",
"counter": 2
},
{
"name": "instrument-1",
"counter": 2
}
]
所需行为:将第一个元素的counter
属性更改为3
,无论何时运行更新代码1次,在运行更多次时都不执行任何操作。
实际行为:
counter
属性更改为3
counter
属性更改为3
counter
属性更改为3
答案 0 :(得分:2)
虽然查询是and
,但它们似乎不是按元素运行的。要解决此问题,可以使用$elemMatch
:
Participation.update({
_id: mongoose.Types.ObjectId(someId),
'instruments': {
$elemMatch: {
'name': instrumentName,
'counter': { $lt: counter } }}
},
// etc.
更多信息:
感谢@ VEERAM指出mongodb homepage还记录了这种行为。