MongoDB数组修改器更新数据
   这里,我们将了解一下数组修改器。数组,是我们经常看到和使用到的且非常有用的数据结构:它不仅可以通过索进行引用,还可以作为集合来使用。数组修改器,顾名思义,它是用来修改数组的,而不能用来修改整数或者字符串。数组修改器不多,就那么几个,但熟练掌握它后,将给我们带来非常方便的操作。下面,我们来了解一下:
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "fname" : "deng",
            "lname" : "pan"
        },
        {
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "dongren",
            "lname" : "zeng"
        }
    ]
}
以上是我的还在完善中的个人信息文档。假设最近我又交了一个好朋友,我想把他加到我的人际关系“relationships”数组中。这时,$push修改器就派上用场了。$push的作用就是,如果指定的键已经存在,它会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。下面我们把新朋友加进去。
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$push:{"relationships":{"fname":"xiong","lname":"lan"}}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "fname" : "deng",
            "lname" : "pan"
        },
        {
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "dongren",
            "lname" : "zeng"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        }
    ]
}
有加就有减,那么怎么对数组进行“减”操作呢。能达到对数组“减”目的的修改器有两个,$pop和$pull。$pop和$pull又有区别,我们来分别实验。首先是$pop
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pop:{"relationships":1}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "fname" : "deng",
            "lname" : "pan"
        },
        {
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "dongren",
            "lname" : "zeng"
        }
    ]
}
从上面可以看出,它把我们刚加进去的朋友又删除了,也就是说它从数组的最后删除。那么,如果我们想从数组的开头删除该怎么办呢。很简单,把上面的“1”改成“-1”,它将逆向操作。下面看一下:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pop:{"relationships":-1}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "dongren",
            "lname" : "zeng"
        }
    ]
}
从结果可以看出,它达到了我们预期的目的。那么如果我们想删除数组中间的呢。这时,$pull派上用场。首先,我们先将新朋友加进去,这里我不再演示。但我们可以想到“dongren”这个人是在数组的中间。现在我们要将他删除:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$pull:{"relationships":{"fname":"dongren","lname":"zeng"}}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        }
    ]
}
从上面可以看出,$pull可以将数组中间的数据删除。这里还有一点要注意,$pull会将所有匹配到的数据都删除,这里我就不做实验了。下面,我们再来看看$push还有什么特点,我们再往数组里插入一相同的数据,看看会如何:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$push:{"relationships":{"fname":"xiong","lname":"lan"}}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        }
    ]
}
结果表明,它是能正常插入到数组的。而在实际生产环境中,我们都不想看到这样的结果,那么,这里又出现了两个可以用的修改器:$ne和$addToSet。$ne主要拿来判断,若数组里面有这个值,则不插入;没有才插入。
> db.user.update({"relationships.fname":{$ne:"xiong"}},{$set:{"fname":"xiong","lname":"lan"}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        }
    ]
}
由结果可以看出,由于该数据在数组中已经存在,所以不再插入。其实,$addToSet比$ne更好用,它可以自己判断数据是否存在,而且它和$each结合使用,还能同时在数组中插入多个数据,这是$ne没办法办到的,下面我们来看一下$addToSet的用法,这里顺便结合了$each的使用:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},
{$addToSet:{"relationships":{$each:[{"fname":"xiong","lname":"lan"},
{"fname":"dongren","lname":"zeng"}]}}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        },
        {
            "fname" : "dongren",
            "lname" : "zeng"
        }
    ]
}
在修改语句中,我们想同时插入{"fname":"xiong","lname":"lan"},
{"fname":"dongren","lname":"zeng"}两个数据,但在原数组中,
{"fname":"xiong","lname":"lan"}这个数据已经存在,所以它只插入了后面那条。达到了我们想要的目的。所以,我个人更喜欢使用$addToSet。
    有时候数组有多个值,而我们只想对其中的一部分进行操作。如果我们把整个文档都抄下来,那太麻烦也太愚蠢了。好在mongodb给我们提供了两种简便方法:通过位置或者操作符“$”。下面我们来分别看看这两种方法怎么使用。首先是通过数组位置来操作。数组都是以0开头的,可以将下标直接作为键来选择元素。例如,我们想给数组的第一个数据加上年龄键值对,我们可以这么操作:
> db.user.update({"_id" : ObjectId("4ffcb2ed65282ea95f7e3304")},{$set:{"relationships.0.age":22}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "age" : 22,
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "fname" : "deng",
            "lname" : "pan"
        },
        {
            "fname" : "xiong",
            "lname" : "lan"
        }
    ]
}
可是很多情况下,不预先查询文档我们就不知道要修改数组的元素的下标。这时定位操作符“$”就很好用了。它就是用来定位查询文档已匹配的元素,并进行更新。我们来看看它怎么用:
> db.user.update({"relationships.fname":"xiong"},{$set:{"relationships.$.age":22}})
> db.user.findOne()
{
    "_id" : ObjectId("4ffcb2ed65282ea95f7e3304"),
    "age" : 23,
    "favorite" : {
        "1" : "reading",
        "2" : "swimming",
        "3" : "listening music"
    },
    "fname" : "jeff",
    "height" : 166,
    "lname" : "jiang",
    "relationships" : [
        {
            "age" : 22,
            "fname" : "qiang",
            "lname" : "he"
        },
        {
            "age" : 22,
            "fname" : "deng",
            "lname" : "pan"
        },
        {
            "age" : 22,
            "fname" : "xiong",
            "lname" : "lan"
        }
    ]
}

MongoDB数组修改器更新数据(转)的更多相关文章

  1. Mongodb嵌套文档的改动-利用数组改动器更新数据

    初学mongodb的可能和我一样有个疑问.mongodb是文档型的,那么假设一个文档嵌套另外一个文档,假设对这个嵌套文档进行增删改查呢. 就像例如以下这样:.怎样对auther里面的name进行增删改 ...

  2. mongodb的修改器

    在mongodb中通常文档只会有一部分要更新,利用原子的更新修改器,可以做到只更新文档的一部分键值,而且更新极为高效,更新修改器是种特殊的键,用来指定复杂的更新操作,比如调整.增加.或者删除键,还可以 ...

  3. 【MongoDB】4.MongoDB 原子修改器的 极速修改

    文档转自:http://blog.csdn.net/mcpang/article/details/7752736 对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能够高 ...

  4. MongoDB之修改器

    MongoDB之修改器 $set  简单粗暴  {name: valuel} 直接将key对应的值赋值给value. db.xxoo.insert({}, {set: {key: value}}) / ...

  5. MongoDB update修改器: 针对Fields的$修改器 $inc $set $unset

    MongoDB update修改器: $inc $set $unset $push $pull $pop 针对Fields的$修改器 $set: { $set: { key: value } } $s ...

  6. MongoDB update修改器 目录

    MongoDB update修改器: 针对Fields的$修改器 $inc $set $unset MongoDB update修改器: 针对Arrays的$修改器 $push $pull $pop ...

  7. MongoDB update修改器: 针对Arrays的$修改器 $push $pull $pop

    针对Arrays的$修改器 $push : { $push: { key: value } } 它是用来对Array (list)数据类型进行 增加 新元素的,相当于我们Python中 list.ap ...

  8. Oracle 常用操作【01】修改、更新数据

    1. oracle 修改表名.列名.字段类型.添加表列.删除表列  alert table scott.test rename to test1--修改表名 alter table scott.tes ...

  9. mongo数组修改器—$push、$ne、$addtoset、$pop、$pull

    这几个方法也很有意思 $push 像已有的数组末尾加入一个元素,要是元素不存在,就会创建一个新的元素,如果元素存在了,就会再添加一个一模一样的元素,会造成元素的重复,所以在使用的时候,要确保该元素不存 ...

随机推荐

  1. linux离线部署redis及redis.conf详解

    一.离线部署redis 由于博主部署的虚拟机没有网络也没有gcc编译器,所以就寻找具备gcc编译器的编译环境把redis编译安装好,Copy Redis安装目录文件夹到目标虚拟机的目录下.copy时r ...

  2. 第12月第30天 love2d

    1. Linux On Linux, you can use one of these command lines: love /home/path/to/gamedir/ love /home/pa ...

  3. HTML5+CSS把footer固定在底部

    在刚开始给网页写footer的时候,我们会碰到一个让人烦躁的问题:当页面内容太少时,footer显示在了页面中间,这是我们不希望出现的,我们希望它能够永远呆在底部,不管网页的内容是多还是少.下面的代码 ...

  4. vue需要注意的事宜

    1.Vue在进行点击事件的时候大部分是在标签上进行添加的,一般在标签上添加@click: 如果需要在组件上面进行点击事件的时候,直接写@click是木有变化的,需要在后面添加一个.native就如@c ...

  5. 克隆虚拟机重启之后eth0不见的解决方案

    今天用虚拟机克隆多一个虚拟机的时候,发现克隆之后的新虚拟机的网卡eth0在配置之后完全是用不了的,下面说一下我的解决办法,亲测可用. 1.用ipconfig命令查看ip信息的时候会发现虚拟机没有找到e ...

  6. 数链剖分(Aragorn's Story )

    题目链接:https://vjudge.net/contest/279350#problem/A 题目大意:n个点,m条边,然后q次询问,因为在树上,两个点能确定一条直线,我们可以对这条直线上的所有值 ...

  7. 【腾讯云】自己搭建的腾讯云服务器JavaEE环境

    0.安装SSH登录 1.生成公钥对 ssh-keygen -t rsa -P '' -P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车.它在/home/ch ...

  8. windows下使用pip安装python模块lxml

    pip install lxml 1 1 会有如下问题:  结果一路解决下去,解决了一个坑还是有一个坑,遂放弃,查找有没有别的解决办法. 亲测使用wheel+pip可以成功安装lxml! wheel本 ...

  9. node koa2

    http://www.codes51.com/itwd/4316421.html 问题: (node.js)nodejs koa ctx=> 报错描述: 刚开始接触 koa 一直提示 ctx=& ...

  10. 查找网内活跃IP和自动传输文本

    ifconfig p32p1|egrep -o "broadcast [^ ]*" |grep -o "[0-9.]*"grep -o "broadc ...