Mongodb-创建、更新、删除相关

数组修改器

  • $inc
    情景【accessLog】:假设一个集合放的是一个网站相关的用户数据(如下),每次有用户访问该网站时即给其访问次数加1:
{
    "_id": ObjectId("565f8fc5e4b0719ee3bd7cb5"),
    "url": "http://www.baidu.com",
    "count": 2 }

Run: db.accessLog.update({“url”:”http://www.baidu.com“},{“$inc”: {“count”,1}});
注意:$inc仅适用于整数,长整数,双精度浮点数;

  • $set And unset
    情景【user】:适用于更新键值的时候,当键值不存在时可自己创建; 同时可以删除其中无用的属性;这就意味这使用$set和unset可以修改表结构;此处仅添加新属性book,并删除属性age做简单介绍;
{
    "_id": ObjectId("565f8fc5e4b0719ee3bd7cb5"),
    "name": "hank",
    "age": 20,
    "sex": male }

Run: db.user.update({“name”:”hank”},{“$set”:{“book”:”green eggs and ham”}});
Run:*db.user.update({“name”:”hank”},{“$unset”:{“age”: 1}});

  • 数组修改器
    情景【blog】: 顾名思义,数组修改器是只能作用于值为数组的键上的,你不能对整数做push,也不能对字符串做pop,如果指定的键值存在,那么$push会向指定键末尾添加一个元素,如果指定键不存才,那么操作会创建这个键;
{
    "_id": ObjectId("565f8fc5e4b0719ee3bd7cb5"),
    "name": "elvis blog",
    "content": "......" }

Run: db.blog.update({“name”:”elvis blog”},{“$push”:{“comments”:{“name”:”hank”,”email”:”[email protected]”,”phone”:”13825647428”}}})
执行之后可查数据格式:

{
    "_id": ObjectId("565f8fc5e4b0719ee3bd7cb5"),
    "name": "elvis blog",
    "content": "......",
    "comment":[ { "name":"hank", "email":"[email protected]", "phone":"13825647428" } ] }
  • $ne
    情景【blog】经常会有这种情况,如果一个值不在数组里面就添加新的值,例如blog.comment中如果name不是hank,就添加type属性;
{
    "_id": ObjectId("565f8fc5e4b0719ee3bd7cb5"),
    "name": "elvis blog",
    "content": "......",
    "comment":[ { "name":"hank", "email":"[email protected]", "phone":"13825647428" } , { "name":"even", "email":"[email protected]", "phone":"13825647428" } ] }

*Run:db.blog.update({“name”:{“$ne”:”hank”}},{“$push”:{“type”:”News”}};

  • $addToSet
    情景【blog】对于一个用户信息文档,它已有email地址,你再给它添加新的email地址时,可避免重复,即使用$addToSet命令去添加email:”[email protected]“时,数组emails的值不发生变化,当添加新值“[email protected]”时,数组emails的元素是要相应增加的;
{
    "_id": ObjectId("565f8fc5e4b0719ee3bd7cb5"),
    "name": "elvis blog",
    "content": "......",
    "emails":[ "[email protected]" ] }
  • $addToSet和$each相结合使用
    情景【blog】对于一个用户信息文档,你如果想一次向这个文档添加多条email信息时;
{
    "_id": ObjectId("565f8fc5e4b0719ee3bd7cb5"),
    "name": "elvis blog",
    "content": "......",
    "emails":[ "[email protected]" ] }

*Run:db.blog.update({“_id”: ObjectId(“565f8fc5e4b0719ee3bd7cb5”)},
{“$addToSet”:{“emails”:{“$each:{“[email protected]”,”[email protected]
,[email protected]}}});

  • $pop按位置删除元素

    • {$pop:{key: 1}} : 删除数组末尾元素
    • {$pop:{key:-1}} :删除数组头元素
  • $pull按条件删除元素

    • 对于数组sort[1,2,1,1]而言,执行 db.blog.update({“$pull”:{“sort”:”1}})时,将会删除所有为1的元素;

数组定位修改器

若是数组有多个值,我们只想对其中一部分进行操作,那此时我们有两种方法可以实现,可以通过位置,也可以通过定位操作符(“$”)

{
    "_id": ObjectId("565f8fc5e4b0719ee3bd7cb5"),
    "content": "......",
    "comments":[ { "content":"goos post" "votes": 1 }, { "content":"too short" "votes": 2 }, { "content":"free watches" "votes": 3 } ] }

此时,如果我们想增加某个comments的votes的话,那么我们可以通过数组元素下标来update

Run:db.collection.update({“_id”: ObjectId(“565f8fc5e4b0719ee3bd7cb5”)},{“$inc”:{“comments.0.votes”:4}})
但是,在绝大多数情况下,我们并不知道将要修改的元素的下标是多少,那么在这种情况下,就可以使用定位操作符来修改了
Run:db.collection.update({“comments.content”:”free watches”},{“comments.$.votes”:10})

Upsert命令

情景【accessLog】:假设一个集合放的是一个网站相关的用户数据(如下),每次有用户访问该网站时即给其访问次数加1,如果能找到特定url,那就给访问次数加1,否则就新建一个文档.在这种情况下,我们欲更改用户访问量,那么或许就要打个来回,如果多个用户访问同一个网站时,我们还要考虑某些限制,那么这种情况下不妨考虑Upsert命令,作用一样,但更高效

Run:db.blog.update({“url”:”/elvis.blog”},{“$inc”:{“visits”:1}},true) update的第三个参数就是upert的开启选项(补充一点,update的第四个选项是更新所有比配元素的开启选项,一般,update只会更新匹配到的第一个元素,开启此选项后,将更新所有匹配元素)

本文仅为本人阅读相关资料的笔记,如有不足之处,还请指出。

你可能感兴趣的:(修改器,定位符,mongodb创建,mongodb更新)