MongoDB简单使用

一、介绍

MongoDB 是一个高性能分布式文件存储数据库,通常采用官方的二进制包进行安装.

二、MongoDB 安装

  • 使用官网二进制包安装 (根据系统选择对应的版本)
wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.8.tgz     -c 选项断点续传
tar -zxvf mongodb-linux-x86_64-3.2.8.tgz
mv mongodb-linux-x86_64-3.2.8  /web/mongodb      //复制到指定目录即可
cd /web/mongodb    
mkdir mongodb_db  //创建数据库存放位置
/web/mongodb/bin/mongod --dbpath=/web/mongodb/mongodb_db/
指定数据库
在另一个终端打开mongodb
/web/mongodb/bin/mongo
出现如下,则说明OK   
2016-04-13T06:58:53.672-0400 I CONTROL  [initandlisten] ** ......
  • MongoDB服务加入随机启动
vi /etc/rc.local
  • 使用vi编辑器打开配置文件,并在其中加入下面一行代码
/web/mongodb/bin/mongod -dbpath=/usr/local/mongodb/data/db --port 27017 -logpath=/usr/local/mongodb/log --logappend
  • MongoDB服务客户端加入环境变量
ln -s /web/ mongodb/bin/mongo  /usr/bin/ mongo
  • 执行mongod启动MongoDB服务器指定配置文件
/web/mongodb/bin/mongod --config mongodb.conf

三、mongodb和关系型数据库的对比图

对比项 mongodb MySQL oracle
集合list 二维表table
表的一行数据 文档document 一条记录record
表字段 键key 字段field
字段值 值value 值value
主外键 PK,FK
灵活度扩展性 极高

四 、基本SHELL命令

创建一个数据库
use [dbname] //此时你什么也没有处理就离开则这个空数据库会被删除
给指定数据库添加集合并且添加记录
db.[documentname].insert({name:"zhangsan"}); //自动创建一个文档ID
查看所有数据库
show dbs //默认提供本地数据
查看数据库中的所有文档
show collections
官方文档:https://docs.mongodb.com/manual/crud/

五、 插入

1.db.collection.insert()
2.db.collection.insertOne() New in version 3.2
3.db.collection.insertMany() New in version 3.2
crud-annotated-mongodb-insert.png

1、db.collection.insert()

  • 插入一个文档没有指定一个_id字段
    db.products.insert( { item: "card", qty: 15 } )
    备注:在插入期间,mongod将创建_id领域并为其分配一个独一无二的ObjectId的文档ID
    { "_id" : ObjectId("5063114bd386d8fadbd6b004"), "item" : "card", "qty" : 15 }
  • 插入一个文档指定一个_id字段
    db.products.insert( { _id: 10, item: "box", qty: 20 } )
    { "_id" : 10, "item" : "box", "qty" : 20 }
  • 一次插入多条,使用数组对象
db.products.insert(
   [
     { _id: 11, item: "pencil", qty: 50, type: "no.2" },
     { item: "pen", qty: 20 },
     { item: "eraser", qty: 25 }
   ]
{ "_id" : 11, "item" : "pencil", "qty" : 50, "type" : "no.2" }
{ "_id" : ObjectId("51e0373c6f35bd826f47e9a0"), "item" : "pen", "qty" : 20 }
{ "_id" : ObjectId("51e0373c6f35bd826f47e9a1"), "item" : "eraser", "qty" : 25 }

2、db.collection.insertOne() New in version 3.2.

  • 插入一个文档没有指定一个_id字段
try {
   db.products.insertOne( { item: "card", qty: 15 } );
} catch (e) {
   print (e);
};
  • 插入一个文档指定一个_id字段
try {
   db.products.insertOne( { _id: 10, item: "box", qty: 20 } );
} catch (e) {
   print (e);
}
  • 插入一个重复的索引值将抛出一个异常。
try {
   db.products.insertOne( { _id: 10, "item" : "packing peanuts", "qty" : 200 } );
} catch (e) {
   print (e);
}
//错误提示
WriteError({
   "index" : 0,
   "code" : 11000,
   "errmsg" : "E11000 duplicate key error collection: inventory.products index: _id_ dup key: { : 10.0 }",
   "op" : {
      "_id" : 10,
      "item" : "packing peanuts",
      "qty" : 200
   }
})

3、db.collection.insertMany() New in version 3.2.

  • 插入一个文档没有指定一个_id字段
try {
   db.products.insertMany( [
      { item: "card", qty: 15 },
      { item: "envelope", qty: 20 },
      { item: "stamps" , qty: 30 }
   ] );
} catch (e) {
   print (e);
}
//输出
{
   "acknowledged" : true,
   "insertedIds" : [
      ObjectId("562a94d381cb9f1cd6eb0e1a"),
      ObjectId("562a94d381cb9f1cd6eb0e1b"),
      ObjectId("562a94d381cb9f1cd6eb0e1c")
   ]
}
  • 插入一个文档指定一个_id字段
try {
   db.products.insertMany( [
      { _id: 10, item: "large box", qty: 20 },
      { _id: 11, item: "small box", qty: 55 },
      { _id: 12, item: "medium box", qty: 30 }
   ] );
} catch (e) {
   print (e);
}
//输出
{ "acknowledged" : true, "insertedIds" : [ 10, 11, 12 ] }

六、查询

db.collection.find()

在插入示例文档之前使用db.users.drop()删除,避免相同文档ID冲突。


crud-annotated-mongodb-find.png
db.users.insertMany(
  [
     {
       _id: 1,
       name: "sue",
       age: 19,
       type: 1,
       status: "P",
       favorites: { artist: "Picasso", food: "pizza" },
       finished: [ 17, 3 ],
       badges: [ "blue", "black" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 85, bonus: 10 }
       ]
     },
     {
       _id: 2,
       name: "bob",
       age: 42,
       type: 1,
       status: "A",
       favorites: { artist: "Miro", food: "meringue" },
       finished: [ 11, 25 ],
       badges: [ "green" ],
       points: [
          { points: 85, bonus: 20 },
          { points: 64, bonus: 12 }
       ]
     },
     {
       _id: 3,
       name: "ahn",
       age: 22,
       type: 2,
       status: "A",
       favorites: { artist: "Cassatt", food: "cake" },
       finished: [ 6 ],
       badges: [ "blue", "red" ],
       points: [
          { points: 81, bonus: 8 },
          { points: 55, bonus: 20 }
       ]
     },
     {
       _id: 4,
       name: "xi",
       age: 34,
       type: 2,
       status: "D",
       favorites: { artist: "Chagall", food: "chocolate" },
       finished: [ 5, 11 ],
       badges: [ "red", "black" ],
       points: [
          { points: 53, bonus: 15 },
          { points: 51, bonus: 15 }
       ]
     },
     {
       _id: 5,
       name: "xyz",
       age: 23,
       type: 2,
       status: "D",
       favorites: { artist: "Noguchi", food: "nougat" },
       finished: [ 14, 6 ],
       badges: [ "orange" ],
       points: [
          { points: 71, bonus: 20 }
       ]
     },
     {
       _id: 6,
       name: "abc",
       age: 43,
       type: 1,
       status: "A",
       favorites: { food: "pizza", artist: "Picasso" },
       finished: [ 18, 12 ],
       badges: [ "black", "blue" ],
       points: [
          { points: 78, bonus: 8 },
          { points: 57, bonus: 7 }
       ]
     }
  ]
)
  • 集合中的所有文档
    db.users.find() //db.users.find().toArray() //转数组形式
  • 指定条件查询
  • 用户集合所有文件status字段值为"A" db.users.find( { status: "A" } )
  • 查询操作符
比较运算符
Name 符号 Description 案例
$eq = 匹配值等于指定值 db.inventory.find( { qty: { $eq: 20 } } ) ; db.inventory.find( { qty: 20 } ) ; db.inventory.find( { tags: { $eq: [ "A", "B" ] } } ) ; db.inventory.find( { tags: [ "A", "B" ] } )
$gt > 匹配值大于指定值 db.inventory.find( { qty: { $gt: 20 } } )
$gte >= 匹配值大于或等于指定值 db.inventory.find( { qty: { $gte: 20 } } )
$lt < 匹配值小于指定值 db.inventory.find( { qty: { $lt: 20 } } )
$lte <= 匹配值小于或等于指定值 db.inventory.find( { qty: { $lte: 20 } } )
$ne != 匹配所有的值不等于指定值 db.inventory.find( { qty: { $ne: 20 } } )
$in exist 匹配任何一个数组中指定的值 db.inventory.find( { qty: { $in: [ 5, 15 ] } } ) ; db.inventory.find( { tags: { $in: [ /^be/, /^st/ ] } } )
$nin not exist 匹配出不在数组中指定的值 db.inventory.find( { qty: { $nin: [ 5, 15 ] } } )
逻辑运算符
Name 符号 Description 案例
$or OR 逻辑或 db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } ) ; db.inventory.find ( { quantity: { $in: [20, 50] } } )
$and AND 逻辑与 db.inventory.find( { $and: [ { price: { $ne: 1.99 } }, { price: { $exists: true } } ] } ) ; db.inventory.find( { price: { $ne: 1.99, $exists: true } } )
$not NOT 不在范围内 db.inventory.find( { price: { $not: { $gt: 1.99 } } } )
$nor NOR 不存在 db.inventory.find( { $nor: [ { price: 1.99 }, { sale: true } ] } )

详细使用官方文档: https://docs.mongodb.com/manual/reference/operator/query/

七、修改

db.collection.update()
crud-annotated-mongodb-update.png
db.collection.update()
db.collection.updateOne() New in version 3.2
db.collection.updateMany() New in version 3.2
db.collection.replaceOne() New in version 3.2

八、删除

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

推荐阅读更多精彩内容