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

Posted

技术标签:

【中文标题】如何更新数组NodeJS,MongoDB中的特定对象【英文标题】:How to update specific object in array NodeJS, MongoDB 【发布时间】:2020-12-18 07:07:06 【问题描述】:

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


   "_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 找到主要对象,然后从godziny[] 通过它的ID(如“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))
    );
  ;

【问题讨论】:

【参考方案1】:

你可以试试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 ));

【讨论】:

如果第二个 id "rbprEs" 也作为 req.param 发送呢? 你的意思是多个ID?或动态ID,您可以设置它检查更新的评论 我的意思是我要发送两个参数。首先确定主要对象。然后第二个 id 识别主要对象内的数组内的特定对象。 是的,我的答案是什么,如果我错了,我不会明白你的意思,你能否通过示例和代码给予正确的理解。 编辑主帖。如果您有更多问题,我会更新。

以上是关于如何更新数组NodeJS,MongoDB中的特定对象的主要内容,如果未能解决你的问题,请参考以下文章

如何对 mongoose/mongodb 和 nodejs 中的对象数组进行排序?

Nodejs,mongodb在插入许多后更新数组

仅删除(更新查询)数组mongodb数组中的特定元素?

如何使用 Java 对 MongoDB 中的文档进行批量更新?

如何使用 NodeJS 将数据添加到 MongoDB 中的数组属性?

搜索数组 MongoDB NodeJS