看如下students文档中的数据:
db.students.insert({_id:NumberInt(1),grades:[NumberInt(80),NumberInt(85),NumberInt(90)]})
db.students.insert({_id:NumberInt(2),grades:[NumberInt(88),NumberInt(90),NumberInt(92)]})
db.students.insert({_id:NumberInt(3),grades:[NumberInt(85),NumberInt(100),NumberInt(90)]})
将第一个文档中grade字段中值为80更新为82,如果不知道数组中元素的位置,可以使用位置$操作符。
db.students.update({_id:1, grades:80},{$set:{'grades.$':NumberInt(82)}})
请记住,位置$操作符充当更新文档查询中第一个匹配的占位符。
二、使用位置操作符$访问数组中嵌套的字段
db.collection.update(
{ <query selector> },
{ <update operator>: { "array.$.field" : value } }
看如下students文档集合中grades的嵌套文档集合
_id: 4,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 90, mean: 85, std: 3 }
更新集合文档的嵌套文档的grade值为85的文档的std字段的值为6
db.students.update(
{ _id: 4, "grades.grade": 85 },
{ $set: { "grades.$.std" : 6 } }
三、使用多个字段匹配更新嵌入式文档
位置操作符$能够更新第一个匹配的数组元素通过$elemMatch()
操作符匹配多个内嵌文档的查询条件
考虑如下的students集合文档grades字段是一个嵌套字段的文档
_id: 4,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 5 },
{ grade: 90, mean: 85, std: 3 }
如下语句会更新嵌套文档中的std值为6,条件是文档的主键是4,字段grades的嵌套文档字段grade字段值小于等于90mean字段值大于80
db.students.update(
_id: 4,
grades: { $elemMatch: { grade: { $lte: 90 }, mean: { $gt: 80 } } }
{ $set: { "grades.$.std" : 6 } }
上面的操作语句会更新掉第一个匹配的嵌套文档集合,如下:
_id: 4,
grades: [
{ grade: 80, mean: 75, std: 8 },
{ grade: 85, mean: 90, std: 6 },
{ grade: 90, mean: 85, std: 3 }
MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL。在使用MongoDB做产品原型的过程中,我们总结了MonogDB的一些亮点:使用JSON风格语法,易于掌握和理解:MongoDB使用JSON的变种BSON作为内部存储的格式和语法。针对MongoDB的操作都使用JSON风格语法,客户端提交或接收的数据都使用JSON形式来展现。相对于SQL来说,更加直观,容易理解和掌握。Schema-less,支持嵌入子文档:MongoDB是一个Schema-free的文档数据库。一个数据库可以有多个Collection,每个Collection是Documents的集合。Collection和Document和传统数据库的Table和Row并不对等。无需事先定义Collection,随时可以创建。Collection中可以包含具有不同schema的文档记录。 这意味着,你上一条记录中的文档有3个属性,而下一条记录的文档可以有10个属性,属性的类型既可以是基本的数据类型(如数字、字符串、日期等),也可以是数组或者散列,甚至还可以是一个子文档(embed document)。这样,可以实现逆规范化(denormalizing)的数据模型,提高查询的速度。图1 MongoDB是一个Schema-free的文档数据库图2是一个例子,作品和评论可以设计为一个collection,评论作为子文档内嵌在art的comments属性中,评论的回复则作为comment子文档的子文档内嵌于replies属性。按照这种设计模式,只需要按照作品id检索一次,即可获得所有相关的信息了。在MongoDB中,不强调一定对数据进行Normalize ,很多场合都建议De-normalize,开发人员可以扔掉传统关系数据库各种范式的限制,不需要把所有的实体都映射为一个Collection,只需定义最顶级的class。MongoDB的文档模型可以让我们很轻松就能将自己的Object映射到collection中实现存储。图2 MongoDB支持嵌入子文档简单易用的查询方式:MongoDB中的查询让人很舒适,没有SQL难记的语法,直接使用JSON,相当的直观。对不同的开发语言,你可以使用它最基本的数组或散列格式进行查询。配合附加的operator,MongoDB支持范围查询,正则表达式查询,对子文档内属性的查询,可以取代原来大多数任务的SQL查询。CRUD更加简单,支持in-place update:只要定义一个数组,然后传递给MongoDB的insert/update方法就可自动插入或更新;对于更新模式,MongoDB支持一个upsert选项,即:“如果记录存在那么更新,否则插入”。MongoDB的update方法还支持Modifier,通过Modifier可实现在服务端即时更新,省去客户端和服务端的通讯。这些modifer可以让MongoDB具有和Redis、Memcached等KV类似的功能:较之MySQL,MonoDB更加简单快速。
MongoDB 数组字段/对象的操作,包括查询、更新。涉及$elemMatch $[identifier],arrayfilter, $addToSet, $push, $pop, $pull, $pullAll等常用操作符。
在MongoDB中,更新单个doc的操作是原子性的。默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的doc更新成功,而后面的doc更新失败的情况。由于更新单个doc的操作是原子性的,如果两个更新同时发生,那么一个更新操作会阻塞另外一个,doc的最终结果值是由时间靠后的更新操作决定的。
我们在前面的文章中提到过文档的基本的增删改查操作,MongoDB中提供的增删改查的语法非常丰富,不清楚的朋友们可以参考这篇文章://www.jb51.net/article/87697.htm
那么下面的本文
MongoDB作为 NoSql 的数据库,能通过嵌套子文档,将横向扩展以及性能做到更好,实现一对多的关联关系。应用开发中,对嵌套子文档结构的查询,不熟悉者 MongoDB 也容易陷入误区。如有如下数据
{ "_id": "1001", "name": "Storage Beta", "items": [ { "category": "food", "name": "pear" }, { "category": "food", "name": "peach" }, { "category": "
1.数组末尾加入一个元素
push的作用就是,如果指定的键已经存在,它会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组
db.user.update({“_id” : ObjectId(“4ffcb2ed65282ea95f7e3304”)},{$push:{“relationships”:{“fname”:”xiong”,”lname”:”lan”}}})
"_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
"age" : 23,
"favorit
db.data_dict.find({"_id": ObjectId("5bcd78cdeeff2c54cbff8f67")});
# $set表示更新"dictValueList"的所有内容,会替换掉原来的值
db.data_dict.update({"_id": ObjectId("5bcd78cdeeff2c54cbff8f67")}, {$set:{"dictValueList":{
"type": 121,
"descr": "切换机构",
{“name": "刘昌颜", "city_spelling_list": "bengbu_meituan"},
{"$set": {"city_spelling_list.$": "text_meituan"}}
$pull单个删除数组中元素
{"name": "刘昌颜"},...
mongo中的数组可以应对复杂的业务场景,不需要先查出后更新,或者先找到一个大范围的集合然后进一步过滤,可以直接更新或直接找到目标文档。
假设我们有个用户发布文章的平台,里面的文档都类似这样
"_id": "5f86e6a5323f7d11e96f5fdf",
"articleId": 1,
"content": "如何问候",
"tag": [
"生活",
"股市",
"comments": [
"commentI
作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用。文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded)
如果要通过内嵌文档来对文档进行查询, 此时属性名必须使用引号
在test库中,存在一个col集合,集合中数据如下
要求: 查询hobby中, movies包含 超脱的文档, 查询代码如下:
db.col.find({"hobby.movies":"超脱"}).pretty()
MongoDB是文档型数据库,每个文档(doc)表示数据的一项记录。相比关系型DB的row只能使用简单的数据类型,doc能够使用复杂的数据类型:内嵌doc,数组。MongoDB的数组是一系列元素的集合,使用中括号 [] 表示数组,例如:[1,2,3]的元素是整数值,[{name:”t5″}, {name:”t7″}],[ {name:”t5″, age:21}, {name:”t7″, age:22} ]的元素是doc。
在MongoDB中,数组元素允许重复,元素的位置是固定的。如果两个数组相等,那么这两个数组的元素和及其位置都相同。
MongoDB中根据数组子元素进行匹配,有两种方式。
Spring-Data-Mongodb的使用Criteria API操作mongodb内嵌文档数据结构mongodb的记录需求内嵌文档内的字段查询java代码中使用Criteria API
Criteria API操作mongodb内嵌文档
物联网行业中,有多种不同的设备,比如卡车有“载重量“的指标,挖掘机有“铲斗容量”的指标,每种类型的设备参数值各不相同,需要大量自定义指标,因此难以使用mysql等传统关系型数据库简历数据结构,针对即有通用字段又有专属字段的情况,文档数据库比较适合此类应用场景,文档数据库
Update操作只作用于集合中存在的文档。MongoDB提供了如下方法来更新集合中的文档:
db.collection.update()db.collection.updateOne() New
in version 3.2db.collection.updateMany() New
in version 3.2db.collection.replaceOne() New
MongoDB是文档型的数据库系统,doc是MongoDB的数据单位,每个doc相当于关系型数据库的数据行(row),doc和row的区别在于field的原子性:row中的column是不和分割的原子对象,而doc中的field可以是原子对象,也可以是内嵌doc(embedded doc),数组等数据类型。内嵌doc中所有field的Key不允许重复。/*** 设备编码* 该属性对应mongodb的字段的名字,如果一直,则无需要注解。