• MongoDB文档的增删改操作


    上一篇文章中介绍了MongoDB的一些基本知识,同时看到了怎么启动一个MongoDB服务,并且通过MongoDB自带的shell工具连接到了服务器。

    这一次,就通过MongoDB shell介绍一下对文档的增删改操作。

    增加新文档

    接着上一篇文章,打开一个MongoDB shell。

    通过“show dbs”可以看到所有的数据库。然后我们通过“use blog”切换到blog数据库来开始下面的演示。

    使用“db”命令显示当前正在使用的数据库。

     1 C:mongodbin>mongo.exe
     2 MongoDB shell version: 2.4.6
     3 connecting to: test
     4 > show dbs
     5 local   0.078125GB
     6 >
     7 > use blog
     8 switched to db blog
     9 >
    10 > db
    11 blog
    12 >

    接下来就开始新建文档,插入文档的操作了

     1 > post1 = {"title":"learn MongoDB", "author":"Wilber", "date":new Date()}
     2 {
     3         "title" : "learn MongoDB",
     4         "author" : "Wilber",
     5         "date" : ISODate("2014-11-29T06:19:32.556Z")
     6 }
     7 > db.blog.posts.insert(post1)
     8 > db.blog.posts.find()
     9 { "_id" : ObjectId("5479657a421b7f1536cfb1f7"), "title" : "learn MongoDB", "author" : "Wilber", "date" : ISODate("2014-1
    10 1-29T06:19:32.556Z") }
    11 > show collections
    12 blog.posts
    13 system.indexes
    14 >

    通过相同的方式插入新的文档。

    post2 = {"title":"learn English", "author":"Will", "date":new Date()}
    post3 = {"title":"learn C#", "author":"Li", "date":new Date()}
    post4 = {"title":"learn SQL", "author":"July", "date":new Date()}

    删除文档

    通过remove操作,可以对文档进行删除。如果没有任何参数,remove将会删除collection中所有的文档,而且删除操作是不可逆的,所以要小心操作。

    1 > db.blog.posts.remove()
    2 > db.blog.posts.find()
    3 >

    同时,remove操作可以支持条件删除。

     1 > db.blog.posts.find()
     2 { "_id" : ObjectId("547967c1421b7f1536cfb1fe"), "title" : "learn MongoDB", "author" : "Wilber", "date" : ISODate("2014-1
     3 1-29T06:29:21.318Z") }
     4 { "_id" : ObjectId("547967c1421b7f1536cfb1ff"), "title" : "learn English", "author" : "Will", "date" : ISODate("2014-11-
     5 29T06:29:21.349Z") }
     6 { "_id" : ObjectId("547967c1421b7f1536cfb200"), "title" : "learn C#", "author" : "Li", "date" : ISODate("2014-11-29T06:2
     7 9:21.365Z") }
     8 { "_id" : ObjectId("547967c2421b7f1536cfb201"), "title" : "learn SQL", "author" : "July", "date" : ISODate("2014-11-29T0
     9 6:29:21.380Z") }
    10 >
    11 >
    12 > db.blog.posts.remove({"author":"Will"})
    13 > db.blog.posts.find()
    14 { "_id" : ObjectId("547967c1421b7f1536cfb1fe"), "title" : "learn MongoDB", "author" : "Wilber", "date" : ISODate("2014-1
    15 1-29T06:29:21.318Z") }
    16 { "_id" : ObjectId("547967c1421b7f1536cfb200"), "title" : "learn C#", "author" : "Li", "date" : ISODate("2014-11-29T06:2
    17 9:21.365Z") }
    18 { "_id" : ObjectId("547967c2421b7f1536cfb201"), "title" : "learn SQL", "author" : "July", "date" : ISODate("2014-11-29T0
    19 6:29:21.380Z") }
    20 >

    更新文档

    可以通过update方法更新数据库中的文档,update有两个参数,一个是查询文档,用来找出要更新的文档,另一个是修改器文档,描述多找到的文档进行怎样的更新。

    文档的更新可以分为两种:文档替换和使用修改器更新

    文档替换

    当文档的模式变化很大的时候,一般都是采用文档替换的方式进行文档更新。

    1 > post1.detailInfo = {"author":"Wilber","description":"this is a post about MongoDB"}
    2 { "author" : "Wilber", "description" : "this is a post about MongoDB" }
    3 > delete post1.author
    4 true
    5 > db.blog.posts.update({"author":"Wilber"}, post1)
    6 > db.blog.posts.find({"detailInfo.author":"Wilber"})
    7 { "_id" : ObjectId("547971c5421b7f1536cfb202"), "title" : "learn MongoDB", "date" : ISODate("2014-11-29T07:12:05.560Z"),
    8  "detailInfo" : { "author" : "Wilber", "description" : "this is a post about MongoDB" } }
    9 >

    修改器更新

    对于只需要部分更新的文档,通过修改器更新会很方便。直接上例子。

    $set: 修改文档的一个指定键的值,如果没有则创建。

    1 > db.blog.posts.update({"author":"Li"}, {$set: {"title":"how to learn C#"}})
    2 > db.blog.posts.find({"author":"Li"})
    3 { "_id" : ObjectId("547971c5421b7f1536cfb204"), "author" : "Li", "date" : ISODate("2014-11-29T07:12:05.591Z"), "title" :
    4  "how to learn C#" }
    5 > db.blog.posts.update({"author":"Li"}, {$set: {"age":27}})
    6 > db.blog.posts.find({"author":"Li"})
    7 { "_id" : ObjectId("547971c5421b7f1536cfb204"), "age" : 27, "author" : "Li", "date" : ISODate("2014-11-29T07:12:05.591Z"
    8 ), "title" : "how to learn C#" }
    9 >

    $addToSet, $push, $pop:这三个都是对数组的操作,$addToSet能够避免重复添加

     1 > comments = []
     2 [ ]
     3 > comment0 = {"score": 70, "content":"just so so"}
     4 { "score" : 70, "content" : "just so so" }
     5 > comment1 = {"score": 90, "content":"very good"}
     6 { "score" : 90, "content" : "very good" }
     7 >
     8 > db.blog.posts.update({"author":"Li"}, {$set: {"comments": comments}})
     9 > db.blog.posts.update({"author":"Li"}, {$set: {"comments.0": comment0}})
    10 > db.blog.posts.update({"author":"Li"}, {$set: {"comments.1": comment1}})
    11 > db.blog.posts.update({"author":"Li"}, {$addToSet: {"comments": comment1}})
    12 > db.blog.posts.find({"author":"Li"})
    13 { "_id" : ObjectId("547971c5421b7f1536cfb204"), "age" : 27, "author" : "Li", "comments" : [     {   "score" : 70,
    14 "content" : "just so so" },     {       "score" : 90,   "content" : "very good" } ], "date" : ISODate("2014-11-29T07:12:
    15 05.591Z"), "title" : "how to learn C#" }
    16 > db.blog.posts.update({"author":"Li"}, {$push: {"comments": comment1}})
    17 > db.blog.posts.find({"author":"Li"})
    18 { "_id" : ObjectId("547971c5421b7f1536cfb204"), "age" : 27, "author" : "Li", "comments" : [     {   "score" : 70,
    19 "content" : "just so so" },     {       "score" : 90,   "content" : "very good" },      {       "score" : 90,   "content
    20 " : "very good" } ], "date" : ISODate("2014-11-29T07:12:05.591Z"), "title" : "how to learn C#" }
    21 > db.blog.posts.update({"author":"Li"}, {$pop: {"comments": comment1}})
    22 > db.blog.posts.find({"author":"Li"})
    23 { "_id" : ObjectId("547971c5421b7f1536cfb204"), "age" : 27, "author" : "Li", "comments" : [     {   "score" : 70,
    24 "content" : "just so so" },     {       "score" : 90,   "content" : "very good" } ], "date" : ISODate("2014-11-29T07:12:
    25 05.591Z"), "title" : "how to learn C#" }
    26 >

    $inc:这个跟$set的用法类似,只不过$inc是专门针对数字操作的。

    1 > db.blog.posts.update({"author":"Li"}, {$inc: {"comments.1.score": 5}})
    2 > db.blog.posts.find({"author":"Li"})
    3 { "_id" : ObjectId("547971c5421b7f1536cfb204"), "age" : 27, "author" : "Li", "comments" : [     {   "score" : 70,
    4 "content" : "just so so" },     {       "score" : 95,   "content" : "very good" } ], "date" : ISODate("2014-11-29T07:12:
    5 05.591Z"), "title" : "how to learn C#" }
    6 >

    $unset:这个命令是用来删除指定键的。

    1 > db.blog.posts.update({"author":"Li"}, {$unset: {"comments": 1}})
    2 > db.blog.posts.find({"author":"Li"})
    3 { "_id" : ObjectId("547971c5421b7f1536cfb204"), "age" : 27, "author" : "Li", "date" : ISODate("2014-11-29T07:12:05.591Z"
    4 ), "title" : "how to learn C#" }

    update(arg1, arg2, arg3, arg4)

    上面已经介绍了update的前两个参数的含义和用法,其实update命令还有两个参数。

    arg3:这个参数代表upsert用法;如果这个参数设置为true,那么就会使用upsert的方式更新文档。

    1 > db.blog.posts.update({"author":"June"}, {"author": "June", "title": "C++ introduction"}, true)
    2 > db.blog.posts.find({"author":"June"})
    3 { "_id" : ObjectId("5479781d217928d2be69552c"), "author" : "June", "title" : "C++ introduction" }
    4 >

    arg4:这个参数可以设置是否批量更新

     1 > db.blog.posts.insert(post1)
     2 > db.blog.posts.find({"detailInfo.author":"Wilber"})
     3 { "_id" : ObjectId("547971c5421b7f1536cfb202"), "title" : "learn MongoDB", "date" : ISODate("2014-11-29T07:12:05.560Z"),
     4  "detailInfo" : { "author" : "Wilber", "description" : "this is a post about MongoDB" } }
     5 { "_id" : ObjectId("54797864421b7f1536cfb206"), "title" : "learn MongoDB", "date" : ISODate("2014-11-29T07:12:05.560Z"),
     6  "detailInfo" : { "author" : "Wilber", "description" : "this is a post about MongoDB" } }
     7 > db.blog.posts.update({"detailInfo.author":"Wilber"}, {$set: {"title":"how to learn MongoDB"}}, false, true)
     8 >
     9 > db.blog.posts.find({"detailInfo.author":"Wilber"})
    10 { "_id" : ObjectId("54797864421b7f1536cfb206"), "date" : ISODate("2014-11-29T07:12:05.560Z"), "detailInfo" : { "author"
    11 : "Wilber", "description" : "this is a post about MongoDB" }, "title" : "how to learn MongoDB" }
    12 { "_id" : ObjectId("547971c5421b7f1536cfb202"), "date" : ISODate("2014-11-29T07:12:05.560Z"), "detailInfo" : { "author"
    13 : "Wilber", "description" : "this is a post about MongoDB" }, "title" : "how to learn MongoDB" }
    14 >

    总结

    这篇文章主要介绍了通过MongoDB shell对数据库文档进行增删改操作,接下来会介绍查询的操作。

    Ps: 附件包含了本文中的所有命令作为参考。

    http://files.cnblogs.com/wilber2013/test.js

    作者:田小计划
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果觉得不错,请点击推荐关注
  • 相关阅读:
    运行top时,会报unknown terminal type错误
    CSS 学习笔记
    HTML学习笔记
    在window平台搭建Qt开发环境(使用VS2008 IDE)
    GNU的ar,ranlib和nm
    GifCam
    linux modprobe命令参数及用法详解--linux加载模块命令
    如何制作gif动画,丰富自己的博客?
    来自 Github 的图形化 Git 使用教程
    idea创建maven-archetype-webapp项目无java目录
  • 原文地址:https://www.cnblogs.com/wilber2013/p/4130708.html
Copyright © 2020-2023  润新知