如何将数据附加到 MERN 堆栈中 mongodb 中的现有数组

Posted

技术标签:

【中文标题】如何将数据附加到 MERN 堆栈中 mongodb 中的现有数组【英文标题】:How to append data to existing array in mongodb in MERN stack 【发布时间】:2020-11-08 22:23:19 【问题描述】: 我有一个看起来像这样的现有数组

  _id: 5f14675a4fb8565fb89ec338,
  name: 'sample5',
  email: 'sample5@test.com',
  rollno: 9,
  city: [
    
      _id: 5f14675a4fb8565fb89ec339,
      cityname: 'Sample City 1',
      citycode: '000000'
    
  ],
  __v: 0

所以我想将数据附加到现有数组中
city: [
    
      _id: 5f14675a4fb8565fb89ec339,
      cityname: 'Sample City 2',
      citycode: '000002'
    
  ],
所以我的最终数据库应该是这样的

  _id: 5f14675a4fb8565fb89ec338,
  name: 'sample5',
  email: 'sample5@test.com',
  rollno: 9,
  city: [
    
      _id: 5f14675a4fb8565fb89ec339,
      cityname: 'Sample City 1',
      citycode: '000000'
    ,
    
      _id: 5f14675a4fb8565fb89ec339,
      cityname: 'Sample City 2',
      citycode: '000002'
    ,
  ],
  __v: 0

目前,我只能更新现有数据,其中显示 citynamecitycode,如果用户进行任何更改,它会反映在数据库中。 我用来更新数据库的代码
// Update Student
router.route('/update-student/:id').put((req, res, next) => 
  studentSchema.findByIdAndUpdate(req.params.id, 
    $set: req.body
  , (error, data) => 
    if (error) 
      return next(error);
      console.log(error)
     else 
      // $push:
      res.json(data)
      console.log('Student updated successfully !')
      // 
    
  )
)
架构结构
let studentSchema = new Schema(
  name: 
    type: String
  ,
  email: 
    type: String
  ,
  rollno: 
    type: Number
  ,
  city: [
    cityname: type: String,
    citycode: type: String,
  ],
, 

    collection: 'students'
  )
然后在路由中使用$push 方法更新
// Update Student
router.route('/update-student/:id').put((req, res, next) => 
  studentSchema.findByIdAndUpdate(req.params.id, 
    $push: req.body
  , (error, data) => 
    if (error) 
      return next(error);
      console.log(error)
     else 
      // $push:
      res.json(data)
      console.log('Student updated successfully !')
      // 
    
  )
)
输出
[_id: "5f12e5158be2503422bf6982", name: "sample1", email: "sample1@test.com", rollno: 1,…,…]
0: _id: "5f12e5158be2503422bf6982", name: "sample1", email: "sample1@test.com", rollno: 1,…
city: [_id: "5f146fb84fb8565fb89ec33c", cityname: "city3", citycode: "12345",…]
0: _id: "5f146fb84fb8565fb89ec33c", cityname: "city3", citycode: "12345"
citycode: "12345"
cityname: "city3"
_id: "5f146fb84fb8565fb89ec33c"
1: _id: "5f15301f67c1992f4a233f77", cityname: "new city", citycode: "new code"
citycode: "new code"
cityname: "new city"
_id: "5f15301f67c1992f4a233f77"
email: "sample1@test.com"
name: "sample1"
rollno: 1
__v: 0
_id: "5f12e5158be2503422bf6982"

【问题讨论】:

【参考方案1】:

查看This 答案,您可能需要在查询中使用$push 来实现您想要的。

【讨论】:

我已经使用 $push 查询更新了我的帖子。但是这些值没有保存到数据库中。 您是否按照他在帖子中的说明进行操作?他还提到了schema的一些变化,你经历过吗?谢谢【参考方案2】: 解决方案 单击提交按钮时。数组以这种方式存储在城市中,因为模式是这样的。这个架构结构就在上面。然后使用 axios 将其传递给数据库。
onSubmit(e) 
    e.preventDefault()

    const studentObject = 
      city: [cityname: this.state.cityname, citycode: this.state.citycode]
    ;

    axios.put('http://localhost:4000/students/update-student/' + this.props.match.params.id, studentObject)
      .then((res) => 
        console.log(res.data)
        console.log('Student successfully updated')
      ).catch((error) => 
        console.log(error)
      )

    // Redirect to Student List 
    this.props.history.push('/student-list')
  

【讨论】:

以上是关于如何将数据附加到 MERN 堆栈中 mongodb 中的现有数组的主要内容,如果未能解决你的问题,请参考以下文章

MERN 堆栈和 Socket 到 Mongodb - 从数据库到前端的实时数据

如何在 MERN 堆栈中向用户显示错误

保存带有中断的文本区域,MERN 堆栈

用户模式中的数组 - 猫鼬

在 MERN 堆栈 Web 应用程序中存储图像的最佳方式

如何在 MERN 堆栈中发送响应模式?