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

Posted

技术标签:

【中文标题】更新数组中的单个项目,其中多个条件适用于任何数组项目【英文标题】:update single item within array where multiple conditions apply to any array item 【发布时间】:2017-09-12 11:49:05 【问题描述】:

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

型号

var ParticipationSchema = new Schema(
    instruments: [
      name: String,
      counter: Number
    ],
// etc.
,

    timestamps: true
);

我现在想准确更改 instruments 数组中的一项,前提是它符合以下要求:

    文档ID必须等于58f3c77d789330486ccadf40 应该更改的instruments-item 的name 必须等于'instrument-1' instrument-item 的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-attribute 中有 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】:

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

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

更多信息:

$elemMatch 上的 API 参考

感谢@VEERAM 指出这种行为也记录在mongodb homepage。

【讨论】:

仅供参考。这些查询是隐式的。所以你不需要$and 运营商。您看到的行为记录在这里。docs.mongodb.com/manual/tutorial/query-array-of-documents/…

以上是关于更新数组中的单个项目,其中多个条件适用于任何数组项目的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 更新数组字段中的单个项目

PayPal IPN 适用于单个购物车项目,但不适用于多个购物车项目

gulp.src基本选项适用于一个数组项

更新多个 SharePoint 列表项

如何在redux中更新特定数组项内的单个值

模板树状数组