如何更新数组 NodeJS, MongoDB 中的特定对象



我正在创建预订系统,现在我需要更新数组中的特定对象。

{
"_id":{
"$oid":"5f3fdcf463153719845e32e9"
},
"do_kogo":"Doctor",
"Startdate":"8/21/2020, 1:00:00 AM",
"EndDate":"8/21/2020, 2:00:00 AM",
"StartdateFormatPL":"21.08.2020, 01:00:00",
"EndDateFormatPL":"21.08.2020, 02:00:00",
"godziny":[
{
"id":"rbprEs",
"hour":"21.08.2020, 01:00:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"lT8WkM",
"hour":"21.08.2020, 01:05:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"n4PJ3V",
"hour":"21.08.2020, 01:10:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"aHM-Gn",
"hour":"21.08.2020, 01:15:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"-EFbRV",
"hour":"21.08.2020, 01:20:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"X64wkx",
"hour":"21.08.2020, 01:25:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"eXv451",
"hour":"21.08.2020, 01:30:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"xxni5q",
"hour":"21.08.2020, 01:35:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"sTkns7",
"hour":"21.08.2020, 01:40:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"MaffJR",
"hour":"21.08.2020, 01:45:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"8DFBra",
"hour":"21.08.2020, 01:50:00",
"isBooked":false,
"isConfirmed":false
},
{
"id":"3Jb5yE",
"hour":"21.08.2020, 01:55:00",
"isBooked":false,
"isConfirmed":false
}
],
"__v":{
"$numberInt":"0"
}
}

我需要的是通过它的id:5f3fdcf463153719845e32e9找到主对象,然后通过它的 id 从godziny[]找到它,就像"rbprEs"一样。之后,我需要isBooked值从 false 更改为 True 或其他方式。

我需要得到:

{
"id":"rbprEs",
"hour":"21.08.2020, 01:00:00",
"isBooked":true,
"isConfirmed":false
},

我正在尝试下面的代码,但它无法正常工作。

router
.post("/upgrade/:id/:id2", (req, res) => {
ReservationHours.findOneAndUpdate(
{ 
// convert id to object id if not using (mongoose.Types.ObjectId(req.params.id))
_id: req.params.id, 
godziny: {
$elemMatch: {
id: req.params.id2,
isBooked: false
}
}
},
// use positional operator $ to update in specific object
{ $set: { "godziny.$.isBooked": true } }
)
.then(ReservationHours =>
ReservationHours.save().then(() => res.json({ success: true }))
)
.catch(err => res.status(404).json({ success: false }));
});

但是我如何获取和更新如此嵌套的参数?

还有该帖子的 React 中的代码:

export const updateReservationHours = (id, id2) => (dispatch, getState) => {
axios.post(`/reservationshours/${id}/${id2}`, tokenConfig(getState)).then(res =>
dispatch({
type: UPDATE_RESERVATION_HOURS,
payload: (id, id2)
})
)
.catch(err =>
dispatch(returnErrors(err.response.data, err.response.status))
);
};

你可以试试findOneAndUpdate,

ReservationHours.findOneAndUpdate(
{ 
// convert id to object id if not using (mongoose.Types.ObjectId(req.params.id))
_id: req.params.id, 
godziny: {
$elemMatch: {
// you can set it dynamic by using (req.params.godziny)
// if its multiple and array then use id: { $in: req.params.godziny }
id: "rbprEs", 
isBooked: false
}
}
},
// use positional operator $ to update in specific object
{ $set: { "godziny.$.isBooked": true } },
// get updated original document
{ projection: { "godziny.$": 1 } } 
)
.then(ReservationHours =>
ReservationHours.save().then(() => res.json({ success: true }))
)
.catch(err => res.status(404).json({ success: false }));

最新更新