MongoDB如何更新多级文档的数据

 更新时间:2021年06月22日 10:39:39   作者:岛上码农  
MongoDB 这类文档型数据库与关系型数据库最大的差别就是所有数据是按文档存储的,因此更新时会涉及深层数据更新,例如更如何新某个对象的下级对象属性。本篇介绍如何更新多级文档的数据。

嵌套数组更新

以下面的数据(数据集名称为author)为例:

{name: '岛上码农', documents: ['Flutter入门与实战', '高性能MySQL', 'MongoDB专业指北']}

我们需要将 MongoDB专业指北改成MongoDB不专业指北,就属于修改嵌套的文档数据了。这个时候需要使用到 MongoDB 提供的定位操作符$。定位操作符即表示将对应条件匹配到的数据,如:

db.author.update(
  {name: '岛上码农', documents: 'MongoDB专业指北'}, 
  {'$set': {'documents.$': 'MongoDB不专业指北'}}
);

对于下级节点为数组的也是一样。

{
  name: '岛上码农', 
  documents: [
    {name: 'Flutter入门与实战', score: 80}, 
    {name: '高性能MySQL', score: 90}, 
    {name: 'MongoDB专业指北', score: 85}
  ]
}

需要将 documengs 节点的 name 和 score 进行修改。

db.author.update(
  {name: '岛上码农', 'documents.name': 'MongoDB专业指北'},
  {'$set': {
    	'documents.$.name': 'MongoDB不专业指北', 
    	'documents.$.score':88}
  }
);

$定位操作符即在查询条件中找到的数组中的数据元素位置,即表示操作的是该位置的数据。

更新下级文档的属性

更新下级文档属性时可以直接使用属性访问符“.”,例如下面需要更新 praise 增加到291。

{
  name: '岛上码农', 
  scores: {
    view:  18800, 
    praise: 290, 
    followers: 105
	}
}
db.author.update(
  {name: '岛上码农'}, 
  {'$set': {'scores.praise': 291}}
);

下级文档若还存在嵌套数组也是类似的操作,如下面的数据,需要将“公众号”换成“微信公众号”:

{
  name: '岛上码农', 
  scores: {
    view:  18800, 
    praise: 290, 
    followers: 105,
    platform: ['掘金', '公众号']
	}
}
db.author.update(
  {'name': '岛上码农', 'scores.platform': '公众号'},
  {'$set': {'scores.platform.$':'微信公众号'}}
);

属性增加和移除

MongoDB提供了 $push 和 $pull操作指令来增加或移除属性,同时还提供了 $pop 来移除数组的第一个或最后一个值。我们给前一个文档增加一个 homepage 属性。

db.author.update(
  {name: '岛上码农'}, 
  {$push: {homepage: 'https://juejin.cn/user/70787819648695'}}
);

注意的是,此时插入的是一个名为 homepage 的数组,其中的一个元素是:juejin.cn/user/707878…。如果是增加不是数组的属性,使用$set 指令即可。 可以使用 pull 移除掉匹配的一个属性。

db.author.update(
  {name: '岛上码农'}, 
  {$pull: {homepage: 'https://juejin.cn/user/70787819648695'}}
);

$pop 操作时使用数字-1和1表示移除首尾的元素,对于下面的数据,移除数组platform里的数据。

{
  name: '岛上码农',
	scores : {
		view: 18800,
		praise: 290,
		followers: 105,
		platform: ['掘金', '公众号', '其他1', '其他2']
	}
}
// 移除第一个元素
db.author.update({name: '岛上码农'}, {$pop: {'scores.platform': -1}});
// 移除最后一个元素
db.author.update({name: '岛上码农'}, {$pop: {'scores.platform': 1}});

总结

本篇介绍了 MongoDB 的嵌套属性更新操作,主要是定位操作符$的使用。通过定位符可以定位我们需要修改的数据位置,进而进行更新操作。以及属性的添加和移除,通过$push、$pull和$pop指令即可完成响应的操作。

以上就是MongoDB如何更新多级文档的数据的详细内容,更多关于MongoDB 更新多级文档的资料请关注脚本之家其它相关文章!

相关文章

  • MongoDB备份、还原、导出、导入、克隆操作示例

    MongoDB备份、还原、导出、导入、克隆操作示例

    这篇文章主要介绍了MongoDB备份、还原、导出、导入、克隆操作示例,本文分别给操作代码、命令实例,需要的朋友可以参考下
    2015-07-07
  • Mongodb增加、移除Arbiter节点实例

    Mongodb增加、移除Arbiter节点实例

    这篇文章主要介绍了Mongodb增加、移除Arbiter节点实例,Arbiter是搭建Mongodb集群的一个必备节点,需要的朋友可以参考下
    2015-01-01
  • MongoDB TTL索引的实例详解

    MongoDB TTL索引的实例详解

    这篇文章主要介绍了 MongoDB TTL索引的实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • 在MongoDB中实现大于小于查询功能

    在MongoDB中实现大于小于查询功能

    MongoDB是一个高性能、开源、无模式的文档型数据库,它使用BSON(Binary JSON)作为存储格式,支持丰富的查询语法,本文将详细介绍如何在MongoDB中实现大于小于查询,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-08-08
  • Windows下MongoDB配置用户权限实例

    Windows下MongoDB配置用户权限实例

    这篇文章主要介绍了Windows下MongoDB配置用户权限实例,本文实现需要输入用户名、密码才可以访问MongoDB数据库,需要的朋友可以参考下
    2015-01-01
  • Navicat远程连接MongoDB最全实现方法以及报错解决

    Navicat远程连接MongoDB最全实现方法以及报错解决

    这篇文章主要给大家介绍了关于Navicat远程连接MongoDB最全实现方法以及报错解决的相关资料,文中通过图文将实现的步骤一步步介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • mongodb字段值自增长实现代码

    mongodb字段值自增长实现代码

    这篇文章主要介绍了mongodb字段值自增长实现,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • mongodb 中rs.stauts()命令参数解析

    mongodb 中rs.stauts()命令参数解析

    MongoDB的rs.status()命令是查看副本集状态的重要工具,它可以展示副本集中各个成员的角色、健康状态、同步进度等关键信息,本文介绍mongodb 中rs.stauts()命令参数解析,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • MongoDB安装使用并实现Python操作数据库

    MongoDB安装使用并实现Python操作数据库

    Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。本文就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-06-06
  • 深究从MongoDB的ObjectId中获取时间信息

    深究从MongoDB的ObjectId中获取时间信息

    MongoDB默认使用_id字段作为主键,类型为ObjectId。ObjectId的生成有一定的规则,详情可以查看这篇文章MongoDB深究之ObjectId
    2017-03-03

最新评论