如何更新 MongoDB 中的数组元素而不是创建新元素
Posted
技术标签:
【中文标题】如何更新 MongoDB 中的数组元素而不是创建新元素【英文标题】:How to update array elements in MongoDB instead of creating new one 【发布时间】:2019-04-21 21:33:21 【问题描述】:我的代码有问题。我想更新文档,如下所示:
"_id":
"$oid": "5bf2ad5a0d46b81798232cf9"
,
"manufacturer": "VW",
"model": "Golf ",
"VIN": "WVWZZZ1J212566691",
"doors": 3,
"class": "compact",
"reservations": [
"_id":
"$oid": "5bf2ad5a0d46b81798232cfa"
,
"pick_up_date":
"$date": "2014-10-13T09:13:00.000Z"
,
"drop_off_date":
"$date": "2014-10-14T09:13:00.000Z"
,
"user_id":
"$oid": "5bec00bdfb6fc005dcd5423b"
],
"createdAt":
"$date": "2018-11-19T12:32:26.665Z"
,
"updatedAt":
"$date": "2018-11-19T12:32:26.665Z"
,
"__v": 0
我想向数组 Reservations 添加新的预订。我的功能:
const createReservationForCarId = ( body , params , res, next) =>
Carmodel.findById(params.id)
.then(notFound(res))
.then((carmodel) => carmodel ? Object.assign(carmodel, body).save() : null)
.then((carmodel) => carmodel ? carmodel.view(true) : null)
.then(success(res))
.catch(next)
但是当我尝试通过以下方式更新时:
router.put('/:id/reservation',
createReservationForCarId)
主体:
"reservations":[
"pick_up_date" : "October 13, 2017 11:13:00",
"drop_off_date": "October 14, 2017 11:13:00",
"user_id":"5bec00bdfb6fc005dcd5423b"
]
Mongo 不是更新我的旧文档,而是创建一个新文档,而上面的正文中只给出了一个保留。
我应该怎么做才能只更新现有文档而不创建新文档?
【问题讨论】:
docs.mongodb.com/manual/reference/method/db.collection.update @Ferus7 看看下面的评论。 【参考方案1】:您可以在代码中尝试使用 findAndModify 而不是 findById。查看语法here
【讨论】:
我已经修改了我的方法并将findById()更改为findByIdAndUpdate(),但是现在它修改了现有文档,详细说明了现有数组对象在预订。我想向数组添加新对象,不修改现有的。 mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate 如何解决这个问题? @Susmita Bhattacharjee 您可以使用 $push 属性将新元素附加到您的预留数组中。看看this 接受的答案。在此示例中,尝试将 "$push": "childrens": employee._id
替换为 "$push": "reservations": "newelement1": "newvalue1", "newelement2":"newvalue2"
【参考方案2】:
我没有使用过 mongoose,但他们有数组操作的文档。
请看这里: https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-push
这里还有用于数组操作的相关 mongo 文档: https://docs.mongodb.com/manual/reference/operator/update/push/
【讨论】:
【参考方案3】:我建议你使用 Mongoose 的 $push 操作符,它会将你的对象附加到现有数组中,并且不会创建一个新数组。
查看此链接:- https://github.com/Automattic/mongoose/issues/4338
【讨论】:
以上是关于如何更新 MongoDB 中的数组元素而不是创建新元素的主要内容,如果未能解决你的问题,请参考以下文章
如何根据另一个字段更新 mongodb 中的数组 dict 元素
获取数组中每个索引的子文档元素计数并更新子文档键 - 数组中的子文档(IN MONGODB)