先做一个初始化,设置一个User类,其初始数据如下:
{ arr: [ 1, 2 ],
_id: 5ac5ee12a79131259413c40f,
name: 'scy',
__v: 0 }
每次以初始数据为基,进行操作。
1、向内嵌数组添加数据
使用操作符 $push,向数组末尾添加数据 ,可重复
//第一个参数是匹配条件 第二个参数是具体操作
User.update({name:"scy"},{$push:{"arr":3}});//向user里面的arr末尾追加元素3
结果如下:
{ arr: [ 1, 2, 3 ],
_id: 5ac5f0d3db343b1888a8969d, name: 'scy',__v: 0 }
一次添加多个数据
User.update({name:"scy"},{$push:{"arr":{$each:[2,3]}}});
2、删除内嵌数组指定数据
使用操作符 $pull
//删除arr所有数据为2的元素
User.update({name:"scy"},{$pull:{"arr":2}});
执行结果:{ arr: [ 1 ], _id: 5ac5f39fdad94e23e8de9aee, name: 'scy', __v: 0 }
如果数组元素是对象,可以根据对象属性操作:
{
name:"scy",
mArray:[{age:13,weight:50},{age:13,weight:30}]
}
User.update({name:"scy"},{$pull:{"mArray":{"weight":30}}});//删除所有weight属性值为30的对象
3、修改内嵌数组指定数据
我暂时还没找到能批量修改数组元素的方法
//将数组里面的第一个元素1修改为3
User.update({"arr":{$all:[1]}},{$set:{"arr.$":2}});
//也可以根据下标
User.update({$set:{"arr.1":22}});//将arr下标为1的元素修改为22
如果数组的元素是对象,如下:
{
name:"scy",
mArray:[{age:13,weight:50},{age:13,weight:30}]
}
修改操作如下:
User.update({"mArray.age":13},{$set:{"mArray.$.age":22}});//将第一个age为13的值修改为22
//还可以这样 mArray.1.age 其中1是下标
User.update({$set:{"mArray.1.age":22}});//将arr第二个元素对象的age改为22
4、查询内嵌数组并返回指定的数据
使用$size 返回指定数组长度的数据
//$size限制比较大 下面表示查询数组长度为2的数据
User.find({arr:{$size:2}})
$slice,这个操作符还是比较强大的
//匹配到的user 将其数组截取第一个返回 如[1,1,2]返回[1]
User.findOne({name:"scy"},{arr:{$slice:1}});
//将匹配到的user的数组 截取返回后面两个元素 如[1,1,2]返回[1,2]
User.findOne({name:"scy"},{arr:{$slice:-2}});
//从数组的下表为1的元素开始 返回两个 如[1,3,2]返回[3,2]
User.findOne({name:"scy"},{arr:{$slice:[1,2]}});