如何向对象中的数组添加数据或者删除数据呢❓增加数据push❓删除数据delete❓一起来看看吧👇👇👇
增加
如果想往数组中添加对象时最常见的是:循环——>push
,那么在mongodb中如何操作呢❓先上数据吧:
{
"_id" : ObjectId("5e72cff594c0f607d9060d08"),
"name" : "Anna",
"age" : 20,
"addressInfo" : [
{
"_id" : ObjectId("5e72cff594c0f607d9060d09"),
"name" : "美国",
"tel" : "13809876543"
}
],
"__v" : 0
}
从上面的数据我们可以看到对象中有_id
,name
,age
,addressInfo
等字段,其中addressInfo
是数组,那么现在向该数组中再加数据该如何操作呢❓👇👇👇我们一起来看看吧——$addToSet
和$push
。
-
$push
返回组内所有值的数组,不去除重复的值。-
实现
router.post('/addTestArr', async (req, res) => { let { _id, address } = { ...req.body }; let data = await Test.findOneAndUpdate({ _id: _id }, { $push: { 'addressInfo': address } },{new:true}); res.json({ data }); })
-
测试
继续点击postman里面的send
按钮,不修改任何参数的值,看下面的效果:
-
-
$addToSet
为组里唯一的值创建一个数组,去除重复的值。-
实现
router.post('/addTestArr', async (req, res) => { let { _id, address } = { ...req.body }; let data = await Test.update({ _id: _id }, { '$addToSet': { //$push 'addressInfo': address } },{new:true}); res.json({ data });
-
测试
继续点击postman里面的send
按钮,不修改任何参数的值,看下面的效果:从图中我们可以清晰地看到相同的值在数组中已经存在了不再重复加入,也就是前面说的去重。
-
删除
同样是上面的数据,假如现在要删除addressInfo
数组中的某条数据,首先想到的是不是先循环数组找到要删除的那条数据后再删除呢❓嗯,没错,大多时候都会这么做的,但是在mongoose中有个知识点可以根据条件找到直接删除,而不需要循环删除,那到底是什么呢❓—— $pull
-
语法
{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }
-
例子
router.delete('/deleteTest', async (req, res) => { let {_id,addressId} = {...req.body}; let data = await Test.update({ _id: _id }, { $pull: { 'addressInfo': { _id: addressId } } }) res.json({ data }); })
-
测试
之后我们看看数据库中的数据: