更新数组,其中多个条件适用于任何数组项

时间:2017-04-16 20:13:19

标签: arrays mongodb mongoose mongoose-schema

我有一个基本的猫鼬模型,其属性instruments代表一个数组。因此,它包含多个项目,每个项目都具有以下属性:namecounter。该文档本身具有自动生成的_id类型ObjectID

模型

var ParticipationSchema = new Schema({
    instruments: [{
      name: String,
      counter: Number
    }],
// etc.
},
{
    timestamps: true
});

我现在想要更改instruments数组中的1个项目,只要它符合以下要求:

  1. 文档ID必须等于58f3c77d789330486ccadf40
  2. 应更改的instruments - 项name必须等于'instrument-1'
  3. instrument - 项counter必须低于3
  4. 查询

    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
    • 在第二次运行时将2nds元素的counter属性更改为3
    • 在第三次运行时将3rds元素的counter属性更改为3

1 个答案:

答案 0 :(得分:2)

虽然查询是and,但它们似乎不是按元素运行的。要解决此问题,可以使用$elemMatch

Participation.update({
         _id: mongoose.Types.ObjectId(someId),
         'instruments': {
            $elemMatch: {
              'name': instrumentName,
              'counter': { $lt: counter } }}
      },
      // etc.

更多信息: