数组修改器
"$push"和"$pop"只能用于数组.
如果指定的键已存在,"$push"会向已有的数组末尾加入一个元素,如果键不存在,就创建一个新数组.
如:
db.blog.insert( { "title":"refactor's blog", "Content":"refactor's blog test", "author": { "name":"refactor", "email":"295240648@163.com" } } )
向以上文档中,添加一个包含一个数组的"comment"键,还向 comment 数组push一个评论.
这个数组会自动创建,并加入评论:
db.blog.update( {"title":"refactor's blog"}, { $push: { "comments": { "name":"refactor2", "content":"nice" } } } )
还想添加一条评论:
db.blog.update( {"title":"refactor's blog"}, { www.2cto.com $push: { "comments": { "name":"refactor3", "content":"good" } } } )
如果一个值不在数组里就把它加进去.可以在查询文档时使用"$ne".
使用"$addToSet"
db.users.insert( { "userName":"refactor", "emails": [ "295240648@163.com", "295240648@126.com" ] } )
向emails添加新地址,用"$addToSet"避免重复
db.users.update( {"userName":"refactor"}, { "$addToSet": { "emails":"295240648@163.com" } } )
这样"295240648@163.com" 不会插入到emails中
db.users.update( www.2cto.com {"userName":"refactor"}, { "$addToSet": { "emails":"295240648@qq.com" } } )
这样"295240648@qq.com" 会插入到emails中
将"$addToSet"和"$each"一起使用,可以添加不同的值.
db.users.update( {"userName":"refactor"}, { "$addToSet": { "emails": { "$each": [ "295240648@111.com", "295240648@112.com", "295240648@113.com" ] } } } )
使用"$pop",可以从数组任何一端删除元素.
{$pop:{key:1}}从数组末尾删除一个元素
{$pop:{key:-1}}从数组头部删除一个元素
使用"$pull",可以根据特定条件删除元素,也可以根据位置删除元素
db.users.update( {"userName":"refactor"}, { "$pull": { "emails":"295240648@111.com" } } )
"$pull"会将所有匹配的部分删掉,对于数组[1,1,2,1]执行pull 1,得到的结果数组是[2]
以上是mongodb的写法
mongoose的话
更新数组中的元素
TestModel.update({'user.email': 'xxxx@xxx.com'}, {$set: {'user.$.username': '一回'}}, {multi: true}, function(err,doc) { });
嵌入文档分为两种基本形式,分别为:
//第一种
var user= new Schema({
email: String,
username: String
});
new Schema(
user:[user]
);
//第二种
new Schema({
user: [{
email: String,
username: String
}]
});
注意,这里第二种嵌入文档的形式虽是这样,但实际编码中这样写存在着问题就是不能更新指定条件的数组成员
追加push
testmodel.update(
{_id:'1'},{$push:{user:{name:'2',email:'xxx@xxxx.com'}}}
);
这样写法有个缺陷,只能更新user数组,其他的项目不能同时更新
所以要同时改其他字段的话用下面的写法
testmodel.findOne({_id:'1'},function(err,doc){
if(doc) {
doc.user.push(
name:'sss',
email:'xxx@xxx.com'
);
doc.sex = '?';
doc.save(function(err,doc){
// do something
});
}
})
删除pull
testmodel.update(
{'user.name':'1'},
{$pull:{user:{_id:'1'}}},
function(err,doc) {
//do something
}
);
注意 这个删除的只能用_id做条件