更新MongoDB中的多个数组元素
更新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 }
}
)
使用$[] 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)