mongodb简明教程

基本概念

  • Document
    MongoDB中数据的基本单元,非常类似于关系型数据系统中的行
  • Collection
    可以看成一个拥有动态模式的表,一个Collection里面的Document可以是各式各样的
  • Database
    一个MongoDB实例可以拥有多个相互独立的Database,每一个Database都拥有自己的集合
  • Mongo Shell
    MongoDB自带的一个简单但功能强大的JavaScript shell,可用于管理MongoDB的实例或数据操作

shell CRUD操作

创建

> use test
switched to db test
> post ={"title":"My Blog Post",
... "content":"Here's my blog post.",
...  "date":new Date()
...  }
{
    "title" : "My Blog Post",
    "content" : "Here's my blog post.",
    "date" : ISODate("2017-05-22T07:29:26.085Z")
}
//post是一个有效的文档,下面将其插入数据库
> db.blog.insert(post)
WriteResult({ "nInserted" : 1 })
//查询blog Collection,发现blog文档已经插入
> db.blog.find()
{ "_id" : ObjectId("5922935f01d2563bad1ad3f8"), "title" : "My Blog Post", "content" : "Here's my blog post.", "date" : ISODate("2017-05-22T07:29:26.085Z") }
>

读取

find和findOne可以接受一个查询文档作为限定文件。findOne代表只查看一个文档。

> db.blog.findOne()
{
    "_id" : ObjectId("5922935f01d2563bad1ad3f8"),
    "title" : "My Blog Post",
    "content" : "Here's my blog post.",
    "date" : ISODate("2017-05-22T07:29:26.085Z")
}

更新

> post.comments = []
[ ]
> db.blog.update({"title" : "My Blog Post"},post)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.blog.find()
{ "_id" : ObjectId("5922935f01d2563bad1ad3f8"), "title" : "My Blog Post", "content" : "Here's my blog post.", "date" : ISODate("2017-05-22T07:29:26.085Z"), "comments" : [ ] }

update接受(至少)两个参数,第一个是限定条件(用于匹配待更新的文档),第二个是新的文档

删除

> db.blog.remove({"title" : "My Blog Post"})
WriteResult({ "nRemoved" : 1 })
> db.blog.find()
> 

remove可将数据库中的文档永久删除。如果没有传入参数,将会删除指定Collection中的全部文档,可以接受一个作为限定条件的文档为参数。

查询

//指定需要返回的键
> db.blog.find({},{"username":1})
{ "_id" : ObjectId("5922c9fb01d2563bad1ad3fb"), "username" : "Joe" }
//剔除查询结果中某些键
> db.blog.find({},{"username":0,"_id":0})
{ "email" : "joe@example.com", "address" : "Beijing" }

//查询条件 "$lt" "$lte" "$gt" "gte"
> db.users.find({"registered":{"$lt":new Date("01/01/2018")}})
{ "_id" : ObjectId("5922cb0601d2563bad1ad3fc"), "name" : "test", "email" : "test@example.com", "age" : 30, "registered" : ISODate("2017-05-22T11:26:45.167Z") }

//OR查询 "$in" "$or"
> db.raffle.find({"ticket_no":{"$in":[725,453,380]}})
> db.raffle.find({"$or":[{"ticket_no":735},{"winner":true}]})

// $not
> db.users.find({"id_num":{"$not":{"$mod":[5,1]}}})

//特定类型查询 null
> db.c.find({"y":null}) //此时返回了不含y键的document
{ "_id" : ObjectId("5922cdfd01d2563bad1ad3ff"), "y" : null }
{ "_id" : ObjectId("5922ce1e01d2563bad1ad400"), "z" : 1 }

> db.c.find({"y":{"$in":[null],"$exists":true}}) //因为没有$eq,采用$in操作符
{ "_id" : ObjectId("5922cdfd01d2563bad1ad3ff"), "y" : null }

//正则
> db.users.find({"name":/Test/i})
{ "_id" : ObjectId("5922cb0601d2563bad1ad3fc"), "name" : "test", "email" : "test@example.com", "age" : 30, "registered" : ISODate("2017-05-22T11:26:45.167Z") }

//查询数组(与查询标量值一样)
> db.food.insert({"fruit":["apple","banana"]})
WriteResult({ "nInserted" : 1 })
> db.food.find({"fruit":"banana"})
{ "_id" : ObjectId("5922cf2d01d2563bad1ad401"), "fruit" : [ "apple", "banana" ] }

//查询数组 $all 
> db.food.find({"fruit":{$all:["banana","apple"]}}) //$all对应数组,顺序无关
{ "_id" : ObjectId("5922cf2d01d2563bad1ad401"), "fruit" : [ "apple", "banana" ] }

//精确匹配
> db.food.find()
{ "_id" : ObjectId("5922cf2d01d2563bad1ad401"), "fruit" : [ "apple", "banana" ] }
> db.food.find({"fruit":["banana","apple"]})

//查询数组 $size
> db.food.find({"fruit":{"$size":2}})
{ "_id" : ObjectId("5922cf2d01d2563bad1ad401"), "fruit" : [ "apple", "banana" ] }

//查询数组 $slice
> db.blog.posts.find()
{ "_id" : ObjectId("5922d14801d2563bad1ad402"), "comments" : [ "d", "dadfs", "ddd", "good" ], "title" : "Nice Title" }
{ "_id" : ObjectId("5922d1d501d2563bad1ad403"), "criteria" : { "comments" : [ "d", "dadfs", "ddd", "good" ] } }
> db.blog.posts.findOne({},{"comments":{"$slice":2}})  //find第二个参数可选(可以指定需要返回的键),通过$slice操作可以返回某个键匹配的数组元素子集
{
    "_id" : ObjectId("5922d14801d2563bad1ad402"),
    "comments" : [
        "d",
        "dadfs"
    ],
    "title" : "Nice Title"
}
//指定数组区间
> db.blog.posts.findOne({},{"comments":{"$slice":[1,3]}})
{
    "_id" : ObjectId("5922d14801d2563bad1ad402"),
    "comments" : [
        "dadfs",
        "ddd",
        "good"
    ],
    "title" : "Nice Title"

//查询内嵌文档
{
    "content" : "dfadsf",
    "comments" : [
        {
            "author" : "joe",
            "score" : 3,
            "comment" : "nice post"
        },
        {
            "author" : "mary",
            "score" : 5,
            "comment" : "terrible post"
        }
    ]
}
> db.blog.insert(a)
WriteResult({ "nInserted" : 1 })
> db.blog.find({"comments":{"author":"joe","score":{"$gte":5}}}) //匹配为空,因为内嵌文档的匹配,必须要整个文档完全匹配
> db.blog.find({"comments":{"author":"joe","score":3,"comment":"nice post"}})
{ "_id" : ObjectId("5922d3d001d2563bad1ad404"), "content" : "dfadsf", "comments" : [ { "author" : "joe", "score" : 3, "comment" : "nice post" }, { "author" : "mary", "score" : 5, "comment" : "terrible post" } ] }

//使用$eleMatch匹配内嵌文档
> db.blog.find({"comments":{"$elemMatch":{"author":"joe","score":{"$gte":1}}}})
{ "_id" : ObjectId("5922d3d001d2563bad1ad404"), "content" : "dfadsf", "comments" : [ { "author" : "joe", "score" : 3, "comment" : "nice post" }, { "author" : "mary", "score" : 5, "comment" : "terrible post" } ] }

//limit skip sort
db.c.find().limit(3) //返回数量上限
db.c.find().skip(3)
db.c.find().sort({username:1,age:-1}) //1升序 -1降序


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容