当前位置: 首页 > 数据库 > MongoDB > 正文

MongoDB数组

2018-04-23 来源:博客园/悦光阴

MongoDB是文档型数据库,每个文档(doc)表示数据的一项记录。相比关系型DB的row只能使用简单的数据类型,doc能够使用复杂的数据类型:内嵌doc,数组。MongoDB的数组是一系列元素的集合,使用中括号 [] 表示数组,例如:[1,2,3]的元素是整数值,[{name:"t5"}, {name:"t7"}],[ {name:"t5", age:21}, {name:"t7", age:22} ]的元素是doc。

在MongoDB中,数组元素允许重复,元素的位置是固定的。如果两个数组相等,那么这两个数组的元素和及其位置都相同。

创建示例collection,使用db.collection.insert()函数和数组参数,一次性向集合中插入3个doc。

user1={ name:"t1", age:21}
user2={ name:"t2", age:22}
user3={ name:"t3", age:23}
 
db.users.insert([user1,user2,user3])

一,使用dot标记法(dot notation)访问数组元素

MongoDB使用 dot 访问数组的元素,或内嵌doc字段。

MongoDB uses the dot notation to access the elements of an array and to access the fields of an embedded document.

users=
{
name:"t1",
age:21,
address: {phone:123,email:"xxx@163.com"},
followers:[{name:"a"},{name:"b"},{name:"c"}]
}

address 字段是内嵌文档,查找phone是123的doc

db.users.find({"addr.phone":123})

followers 字段是数组,查询followers中存在name=“b”的doc

db.users.find({"followers.name":"b"})

二,修改字段的值

在MongoDB中,修改操作主要使用两个修改器:$set 和 $inc,这两个修改器具有upsert特性:如果doc中存在相应的字段,那么修改该字段的值;如果doc中不存在相应的字段,那么在doc中创建新的字段。$inc用于整数型字段,增加或减少字段的值,$set用于任意数据类型,替换字段的值。

1,使用$set修改器,增加followers数组,使用empty filter:{},表示更新集合中的所有doc

db.users.updateMany(
{},
{$set:
   {
    followers:[ {name:"t5"},{name:"t7"} ]
   }
}
)

2,使用$inc修改器,增加age字段的值,每个doc的age字段的都增加1

db.users.updateMany(
{},
{$inc:{age:1}}
)

3,$set 和 $inc的不同之处在于:$set是替换现有字段的值,而$inc是在现有字段值的基础上,增加或减少指定的数值

示例,使用$set修改age的值,更新结束后,每个doc的age字段都是1

db.users.updateMany(
{},
{$set:{age:1}}
)

三,修改数组

如果要向数组中增加或删除一个元素,$set和$inc 都不能很好的满足这种需求,MongoDB有专用的 Array Operator,用于修改数组字段。

1,使用$push向doc中增加数组,或插入新的元素

$push:如果doc中存在相应的数组字段,那么向数组的尾部插入一个元素;如果doc中不存在相应的数组字段,那么向doc中创建一个数组字段,并初始化。

示例,第一次调用$push,由于doc中不存在comments字段,因此MongoDB向doc中新建comments 数组字段,并初始化数组

db.users.updateMany(
{},
{$push:{comments:{msg:"c1"}}}
)

示例,后续再次调用$push,向已有的数组字段的尾部追加一个元素

db.users.updateMany(
{},
{$push:{comments:{msg:"c2"}}}
)

图示,左边是数组的第一个元素,右边是数组的最后一个元素,使用$push每次向数组的尾部追加一个元素