更新MongoDB中的多个数组元素

8 浏览
0 Comments

更新MongoDB中的多个数组元素

当日期大于特定值时,我想将chargeList的isDelete属性更新为true。我的模式如下:

{
   "chargeList": [
     { 
         "date": ISODate("2013-06-26T18:57:30.012Z"),
         "price": "123",
         "isDelete": false
     },
     { 
         "date": ISODate("2013-06-27T18:57:30.012Z"),
         "price": "75",
         "isDelete": false
     }
   ]
}

模式如下:

var ChargeListSchema= new Schema({
    date:  { type: Date , default: Date.now  },
    price: { type: String, required: false },
    isDelete: { type: Boolean, default: false }
});
var ScheduleChargeSchema = new Schema({
  chargeList:[ChargeListSchema]
});

我尝试了以下代码,但它只会更新chargeList数组中匹配的第一个元素:

Model.update(

{

"_id": 1,

"chargeList": {

"$elemMatch": {

"date": {

$gt: ISODate("2013-06-26T18:57:30.012Z")

}

}

}

},

{

"$set": { "chargeList.$.isDelete": true }

}

)

0
0 Comments

使用$[] all positional operator来更新数组中的多个元素。

Model.update(
  { "_id": 1, "chargeList.date": { "$gt":  ISODate("2013-06-26T18:57:30.012Z") }},
  { "$set": { "chargeList.$[].isDelete": true } }
)

以上代码没有更新任何记录。请检查条件或者提供你的schema。

添加了schema到帖子中。

我的mongoose版本是4.11.6。

你的mongodb版本是多少?

mongodb版本是3.6.3。

对我来说是可以工作的,也应该适用于你。请检查条件和筛选标准。

好的,试一下,移除所有的条件和筛选标准,尝试简单地使用以下代码:

Model.update(
  { "_id": 1 },
  { "$set": { "chargeList.$[].isDelete": true } }
)

移除条件 "_id": 1 仍然不起作用,而 { "$set": { "chargeList.$.isDelete": true } } 仍然起作用,但只更新一个。

好的,明白了。将您的mongoose版本升级到5.x。

无法升级,因为项目的一些mongoose功能与新版本不兼容。

实际上,mongodb版本3.6与mongoose 4.x不兼容,您必须升级才能使用$[] positional operator,并且我认为5.x具有4.x的所有功能...所以不用担心。

你确定是版本的问题吗?先前版本有什么解决方法?

您可以参考这个stackoverflow的链接:

- [update multiple elements in an array](https://stackoverflow.com/questions/51244687/51244726#51244726)

- [update multiple elements in an array in mongodb](https://stackoverflow.com/questions/51206841/51208305#51208305)

0