内嵌数组操作

 

数组修改器
"$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做条件

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值