• 售前

  • 售后

热门帖子
入门百科

MongoDB安装使用并实现Python操作数据库

[复制链接]
井底燕雀傥 显示全部楼层 发表于 2021-8-14 14:59:20 |阅读模式 打印 上一主题 下一主题
目次


  • 一、MongoDB先容
  • 二、安装MongoDB
  • 三、利用MongoDB

    • 1、插入数据
    • 2、查找数据
    • 3、更新数据
    • 4、删除数据
    • 5、条件运算符
    • 6、MongoDB Limit与Skip方法
    • 7.MongoDB排序
    • 8.MongoDB索引
    • 8.MongoDB 聚合

  • 四 Python操纵MongoDB

一、MongoDB先容

MongoDB 是一个是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,黑白关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是雷同json的bson格式,因此可以存储比力复杂的数据范例。Mongo最大的特点是他支持的查询语言非常强大,其语法有点雷同于面向对象的查询语言,几乎可以实现雷同关系数据库单表查询的绝大部门功能,而且还支持对数据创建索引。

二、安装MongoDB

MongoDB安装很简单,无需下载源文件,可以直接用apt-get下令进行安装。假如网速太差,而且已经下载MongoDB的安装包时,可以离线方式安装,参考Ubuntu下MongoDB安装与利用教程(离线安装方式)。保举利用apt-get下令进行在线安装,可以制止很多莫名其妙的问题。
以下下令
  1. sudo apt-get install mongodb
复制代码
可下载安装MongoDB,默认安装的版本是MongoDB 2.6.10,但如今MongoDB已经升级到3.2.8,这里将引导读者通过添加软件源的方式来安装3.2.8版本。
起首打开终端,导入公共key到包管理器,输入以下下令:
  1. sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927   
复制代码
创建MongoDB的文件列表
  1. #仅适用于Ubuntu14.04,输入:
  2. echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
  3. 更新包管理器,安装MongoDB,输入以下命令:
  4. sudo apt-get update
  5. sudo apt-get install -y mongodb-org
复制代码
注意:假如执行“sudo apt-get update”下令后出现如下错误:
  1. ···
  2. update completed, but some metadata was ignored due to errors.
  3. E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用)
  4. E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
  5. ···
复制代码
请按照如下方法办理错误,也就是输入以下三条下令:
  1. sudo rm /var/cache/apt/archives/lock
  2. sudo rm /var/lib/dpkg/lock
  3. sudo apt-get update
复制代码
运行上面三条下令以后,应该就可以顺利完成apt-get update了。
安装完成MongoDB以后,在终端输入以下下令查察MongoDB版本:
  1. mongo -version
复制代码
输出书籍信息,表明安装成功。
启动和关闭mongodb下令如下:
  1. sudo service mongodb start
  2. sudo service mongodb stop
复制代码
默认设置MongoDB是随Ubuntu启动自动启动的。
输入以下下令查察是否启动成功:
  1. pgrep mongo -l   #注意:-l是英文字母l,不是阿拉伯数字1
复制代码
查察是否启动成功
出现安装错误的办理方案:
输入“sudo service mongodb start”启动mongodb的时候,假如报这个错误:Failed to start mongod.service: Unit not found
请按照如下步调办理该错误:
(1)利用vim编辑器创建配置文件
  1. sudo vim /etc/systemd/system/mongodb.service
复制代码
(2)在该配置文件中添加如下内容:
  1. [Unit]
  2. Description=High-performance, schema-free document-oriented database
  3. After=network.target
  4. [Service]
  5. User=mongodb
  6. ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
  7. [Install]
  8. WantedBy=multi-user.target
复制代码
生存退出vim编辑器。
(3)输入如下下令启动mongodb:
  1. sudo systemctl start mongodb
  2. sudo systemctl status mongodb
复制代码
这时就可以启动成功了。
以后,每次启动和关闭MongoDB,就可以仍然利用如下下令:
  1. sudo service mongodb start
  2. sudo service mongodb stop
复制代码
三、利用MongoDB

shell下令模式
输入如下下令进入MongoDB的shell下令模式:
  1. mongo
  2. 或者:sudo mongo
复制代码
默认连接的数据库是test数据库,在此之前一定要确保你已经启动了MongoDB,否则会出现错误,启动之后运行成功,如下
mongo shell常用操纵下令:
  1. 数据库相关
  2. show dbs:显示数据库列表
  3. show collections:显示当前数据库中的集合(类似关系数据库中的表table)
  4. show users:显示所有用户
  5. use yourDB:切换当前数据库至yourDB
  6. db.help() :显示数据库操作命令
  7. db.yourCollection.help() :显示集合操作命令,yourCollection是集合名
复制代码
MongoDB没有创建数据库的下令,假如你想创建一个“School”的数据库,先运行use School下令,之后做一些操纵(如:创建聚集聚集db.createCollection(‘teacher')),如许就可以创建一个名叫“School”的数据库。
自动创建school数据库
下面以一个School数据库为例,在School数据库中创建两个聚集teacher和student,并对student聚会合的数据进行增删改查根本操纵(聚集Collection相当于关系型数据库中的表table)。
1、切换到School数据库
  1. use School #切换到School数据库。MongoDB 无需预创建School数据库,在使用时会自动创建
复制代码
2、创建聚集Collection
本章节我们为各人先容怎样利用 MongoDB 来创建聚集。
MongoDB 中利用 createCollection() 方法来创建聚集。
语法格式:
  1. db.createCollection(name, options)
复制代码
参数说明:

name: 要创建的聚集名称
options: 可选参数, 指定有关内存巨细及索引的选项
options 可以是如下参数:
在插入文档时,MongoDB 起首检查固定聚集的 size 字段,然后检查 max 字段。
实例
  1. 在 test 数据库中创建 runoob 集合:
  2. > use test
  3. switched to db test
  4. > db.createCollection("runoob")
  5. { "ok" : 1 }
  6. >
  7. 如果要查看已有集合,可以使用 show collections 命令:
  8. > show collections
  9. runoob
  10. system.indexes
  11. 下面是带有几个关键参数的 createCollection() 的用法:
  12. 创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
  13. > db.createCollection("mycol", { capped : true, autoIndexId : true, size :  6142800, max : 10000 } )
  14. { "ok" : 1 }
  15. >
  16. 在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
  17. > db.mycol2.insert({"name" : "菜鸟教程"})
  18. > show collections
  19. mycol2
  20. ...
  21. ##创建一个聚集集合。MongoDB 其实在插入数据的时候,也会自动创建对应的集合,无需预先创建
复制代码
几种告急的数据范例。
ObjectId
ObjectId 雷同唯一主键,可以很快的去生成和排序,包罗 12 bytes,寄义是:


前 4 个字节表示创建 unix时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
接下来的 3 个字节是呆板标识码
紧接的两个字节由历程 id 构成 PID
末了三个字节是随机数
MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何范例的,默认是个 ObjectId 对象
由于 ObjectId 中生存了创建的时间戳,所以你不需要为你的文档生存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
  1. > var newObject = ObjectId()
  2. > newObject.getTimestamp()
  3. ISODate("2017-11-25T07:21:10Z")
  4. ObjectId 转为字符串
  5. > newObject.str
  6. 5a1919e63df83ce79df8b38f
  7. 字符串
  8. BSON 字符串都是 UTF-8 编码。
复制代码
时间戳
BSON 有一个特殊的时间戳范例用于 MongoDB 内部利用,与普通的日期范例不相干。 时间戳值是一个 64 位的值。此中:
前32位是一个 time_t 值(与Unix新纪元相差的秒数)
后32位是在某秒中操纵的一个递增的序数
在单个 mongod 实例中,时间戳值通常是唯一的。
在复制会合, oplog 有一个 ts 字段。这个字段中的值利用BSON时间戳表示了操纵时间。
BSON 时间戳范例主要用于 MongoDB 内部利用。在大多数情况下的应用开发中,你可以利用 BSON 日期范例。
日期
表示当前间隔 Unix新纪元(1970年1月1日)的毫秒数。日期范例是有符号的, 负数表示 1970 年之前的日期。
  1. > var mydate1 = new Date()     //格林尼治时间
  2. > mydate1
  3. ISODate("2018-03-04T14:58:51.233Z")
  4. > typeof mydate1
  5. object
  6. > var mydate2 = ISODate() //格林尼治时间
  7. > mydate2
  8. ISODate("2018-03-04T15:00:45.479Z")
  9. > typeof mydate2
  10. object
  11. 这样创建的时间是日期类型,可以使用 JS 中的 Date 类型的方法。
  12. 返回一个时间类型的字符串:
  13. > var mydate1str = mydate1.toString()
  14. > mydate1str
  15. Sun Mar 04 2018 14:58:51 GMT+0000 (UTC)
  16. > typeof mydate1str
  17. string
  18. 或者
  19. > Date()
  20. Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)   
复制代码
1、插入数据

与数据库创建雷同,插入数据时也会自动创建聚集。
插入数据有两种方式:insert和save。
  1. db.student.insert({_id:1, sname: 'zhangsan', sage: 20}) #_id可选
  2. db.student.save({_id:1, sname: 'zhangsan', sage: 22}) #_id可选
复制代码
这两种方式,其插入的数据中_id字段均可不写,会自动生成一个唯一的_id来标识本条数据。而insert和save不同之处在于:在手动插入_id字段时,假如_id已经存在,insert不做操纵,save做更新操纵;假如不加_id字段,两者作用相同点都是插入数据。
insert和save添加的数据其结构是松散的,列属性均不固定,根据添加的数据为准。先界说数据再插入,就可以一次性插入多条数据,
插入多条
运行完以上例子,student 已自动创建,这也说明 MongoDB 不需要预先界说 collection ,在第一次插入数据后,collection 会自动的创建。

2、查找数据

MongoDB 查询文档利用 find() 方法。
find() 方法以非结构化的方式来表现所有文档。
语法
MongoDB 查询数据的语法格式如下:
  1. db.collection.find(query, projection)
  2. query :可选,使用查询操作符指定查询条件
  3. projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
  4. 如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
  5. >db.col.find().pretty()
  6. pretty() 方法以格式化的方式来显示所有文档。
复制代码
除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
MongoDB 与 RDBMS Where 语句比力
假如你熟悉通例的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:


MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即通例 SQL 的 AND 条件。
语法格式如下:
  1. db.col.find({key1:value1, key2:value2}).pretty()
复制代码
MongoDB OR 条件
MongoDB OR 条件语句利用了关键字 $or,语法格式如下:
  1. db.col.find(
  2.    {
  3.       $or: [
  4.          {key1: value1}, {key2:value2}
  5.       ]
  6.    }
  7. ).pretty()
复制代码
AND 和 OR 团结利用
以下实例演示了 AND 和 OR 团结利用,雷同通例 SQL 语句为: ‘where likes>50 AND (by = ‘菜鸟教程' OR title = ‘MongoDB 教程')'
  1. db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
复制代码
3、更新数据

MongoDB 更新文档
MongoDB 利用 update() 和 save() 方法来更新聚会合的文档。接下来让我们详细来看下两个函数的应用及其区别。
update() 方法
update() 方法用于更新已存在的文档。语法格式如下:
  1. db.collection.update(
  2.    <query>,
  3.    <update>,
  4.    {
  5.      upsert: <boolean>,
  6.      multi: <boolean>,
  7.      writeConcern: <document>
  8.    }
  9. )
复制代码
参数说明:
query : update的查询条件,雷同sql update查询内where背面的。
update : update的对象和一些更新的操纵符(如 set, s e t , inc…)等,也可以理解为sql update查询内set背面的
upsert : 可选,这个参数的意思是,假如不存在update的记载,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记载,假如这个参数为true,就把按条件查出来多条记载全部更新。
writeConcern :可选,抛出非常的级别。
实例
我们在聚集 col 中插入如下数据:
  1. >db.col.insert({
  2.     title: 'MongoDB 教程',
  3.     description: 'MongoDB 是一个 Nosql 数据库',
  4.     by: '菜鸟教程',
  5.     url: 'http://www.runoob.com',
  6.     tags: ['mongodb', 'database', 'NoSQL'],
  7.     likes: 100
  8. })
复制代码
接着我们通过 update() 方法来更新标题(title):
  1. >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})     ##加$set 用处:仅修改目标行,否则不会保留其他行。
  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 输出信息
  3. > db.col.find().pretty()
  4. {
  5.         "_id" : ObjectId("56064f89ade2f21f36b03136"),
  6.         "title" : "MongoDB",
  7.         "description" : "MongoDB 是一个 Nosql 数据库",
  8.         "by" : "菜鸟教程",
  9.         "url" : "http://www.runoob.com",
  10.         "tags" : [
  11.                 "mongodb",
  12.                 "database",
  13.                 "NoSQL"
  14.         ],
  15.         "likes" : 100
  16. }
  17. >
  18. #可以看到标题(title)由原来的 "MongoDB 教程" 更新为了 "MongoDB"。
复制代码
以上语句只会修改第一条发现的文档,假如你要修改多条相同的文档,则需要设置 multi 参数为 true。
  1. >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
复制代码
save() 方法
save() 方法通过传入的文档来替换已有文档。语法格式如下:
  1. db.collection.save(
  2.    <document>,
  3.    {
  4.      writeConcern: <document>
  5.    }
  6. )
复制代码
参数说明:
document : 文档数据。
writeConcern :可选,抛出非常的级别。
实例
以下实例中我们替换了 _id 为 56064f89ade2f21f36b03136 的文档数据:
  1. >db.col.save({
  2.     "_id" : ObjectId("56064f89ade2f21f36b03136"),
  3.     "title" : "MongoDB",
  4.     "description" : "MongoDB 是一个 Nosql 数据库",
  5.     "by" : "Runoob",
  6.     "url" : "http://www.runoob.com",
  7.     "tags" : [
  8.             "mongodb",
  9.             "NoSQL"
  10.     ],
  11.     "likes" : 110
  12. })
  13. 替换成功后,我们可以通过 find() 命令来查看替换后的数据
  14. >db.col.find().pretty()
  15. {
  16.         "_id" : ObjectId("56064f89ade2f21f36b03136"),
  17.         "title" : "MongoDB",
  18.         "description" : "MongoDB 是一个 Nosql 数据库",
  19.         "by" : "Runoob",
  20.         "url" : "http://www.runoob.com",
  21.         "tags" : [
  22.                 "mongodb",
  23.                 "NoSQL"
  24.         ],
  25.         "likes" : 110
  26. }
  27. >
复制代码
更多实例
只更新第一条记载:
  1. db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
复制代码
全部更新:
  1. db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
复制代码
只添加第一条:
  1. db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
复制代码
全部添加加进去:
  1. db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
复制代码
全部更新:
  1. db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
复制代码
只更新第一条记载:
  1. db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
复制代码
4、删除数据

在前面的几个章节中我们已经学习了MongoDB中怎样为聚集添加数据和更新数据。在本章节中我们将继承学习MongoDB聚集的删除。
MongoDB remove()函数是用来移除聚会合的数据。
MongoDB数据更新可以利用update()函数。在执行remove()函数前先执行find()下令来判定执行的条件是否精确,这是一个比力好的风俗。
语法
remove() 方法的根本语法格式如下所示:
  1. db.collection.remove(
  2.    <query>,
  3.    <justOne>
  4. )
复制代码
假如你的 MongoDB 是 2.6 版本以后的,语法格式如下:
  1. db.collection.remove(
  2.    <query>,
  3.    {
  4.      justOne: <boolean>,
  5.      writeConcern: <document>
  6.    }
  7. )
复制代码
参数说明:
query :(可选)删除的文档的条件。
justOne : (可选)假如设为 true 或 1,则只删除一个文档。
writeConcern :(可选)抛出非常的级别。
实例
以下文档我们执行两次插入操纵:
  1. >db.col.insert({title: 'MongoDB 教程',
  2.     description: 'MongoDB 是一个 Nosql 数据库',
  3.     by: '菜鸟教程',
  4.     url: 'http://www.runoob.com',
  5.     tags: ['mongodb', 'database', 'NoSQL'],
  6.     likes: 100
  7. })
复制代码
利用 find() 函数查询数据:
  1. > db.col.find()
  2. { "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
  3. { "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
  4. 接下来我们移除 title 为 'MongoDB 教程' 的文档:
  5. >db.col.remove({'title':'MongoDB 教程'})
  6. WriteResult({ "nRemoved" : 2 })           # 删除了两条数据
  7. >db.col.find()
  8. ……                                        # 没有数据
  9. 如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
  10. >db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
  11. 如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
  12. >db.col.remove({})
  13. >db.col.find()
  14. >
复制代码
5、条件运算符

条件操纵符用于比力两个表达式并从mongoDB聚会合获取数据。
MongoDB中条件操纵符有:
  1. (>) 大于 - $gt
  2. (<) 小于 - $lt
  3. (>=) 大于等于 - $gte
  4. (<= ) 小于等于 - $lte
复制代码
我们利用的数据库名称为”runoob” 我们的聚集名称为”col”,以下为我们插入的数据。
为了方便测试,我们可以先利用以下下令清空聚集 “col” 的数据:
db.col.remove({})
插入以下数据
  1. >db.col.insert({
  2.     title: 'PHP 教程',
  3.     description: 'PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。',
  4.     by: '菜鸟教程',
  5.     url: 'http://www.runoob.com',
  6.     tags: ['php'],
  7.     likes: 200
  8. })
  9. >db.col.insert({title: 'Java 教程',
  10.     description: 'Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。',
  11.     by: '菜鸟教程',
  12.     url: 'http://www.runoob.com',
  13.     tags: ['java'],
  14.     likes: 150
  15. })
  16. >db.col.insert({title: 'MongoDB 教程',
  17.     description: 'MongoDB 是一个 Nosql 数据库',
  18.     by: '菜鸟教程',
  19.     url: 'http://www.runoob.com',
  20.     tags: ['mongodb'],
  21.     likes: 100
  22. })
复制代码
利用find()下令查察数据:
  1. db.col.find()
复制代码
MongoDB (>) 大于操纵符 - $gt
假如你想获取 “col” 聚会合 “likes” 大于 100 的数据,你可以利用以下下令:
  1. db.col.find({"likes" : {$gt : 100}})
  2. 类似于SQL语句:
  3. Select * from col where likes > 100;
  4. 输出结果:
  5. > db.col.find({"likes" : {$gt : 100}})
  6. { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
  7. { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
  8. >
  9. MongoDB(>=)大于等于操作符 - $gte
  10. 如果你想获取"col"集合中 "likes" 大于等于 100 的数据,你可以使用以下命令:
  11. db.col.find({likes : {$gte : 100}})
  12. 类似于SQL语句:
  13. Select * from col where likes >=100;
  14. 输出结果:
  15. > db.col.find({likes : {$gte : 100}})
  16. { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
  17. { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
  18. { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
  19. >
  20. MongoDB (<) 小于操作符 - $lt
  21. 如果你想获取"col"集合中 "likes" 小于 150 的数据,你可以使用以下命令:
  22. db.col.find({likes : {$lt : 150}})
  23. 类似于SQL语句:
  24. Select * from col where likes < 150;
  25. 输出结果:
  26. > db.col.find({likes : {$lt : 150}})
  27. { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
  28. MongoDB (<=) 小于操作符 - $lte
  29. 如果你想获取"col"集合中 "likes" 小于等于 150 的数据,你可以使用以下命令:
  30. db.col.find({likes : {$lte : 150}})
  31. 类似于SQL语句:
  32. Select * from col where likes <= 150;
  33. 输出结果:
  34. > db.col.find({likes : {$lte : 150}})
  35. { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
  36. { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
  37. MongoDB 使用 (<) 和 (>) 查询 - $lt 和 $gt
  38. 如果你想获取"col"集合中 "likes" 大于100,小于 200 的数据,你可以使用以下命令:
  39. db.col.find({likes : {$lt :200, $gt : 100}})
  40. 类似于SQL语句:
  41. Select * from col where likes>100 AND  likes<200;
  42. 输出结果:
  43. > db.col.find({likes : {$lt :200, $gt : 100}})
  44. { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
  45. >
复制代码
6、MongoDB Limit与Skip方法

MongoDB Limit() 方法
假如你需要在MongoDB中读取指定命目标数据记载,可以利用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记载条数。
语法
limit()方法根本语法如下所示:
  1. db.COLLECTION_NAME.find().limit(NUMBER)
复制代码
实例
聚集 col 中的数据如下:
  1. db.col.find({},{"title":1,_id:0}).limit(2)      #  _id:0(投影1:表示显示0:表示隐藏)
  2. { "title" : "PHP 教程" }
  3. { "title" : "Java 教程" }
  4. 注:如果你们没有指定limit()方法中的参数则显示集合中的所有数据。
复制代码
MongoDB Skip() 方法
我们除了可以利用limit()方法来读取指定命目标数据外,还可以利用skip()方法来跳过指定命目标数据,skip方法同样接受一个数字参数作为跳过的记载条数。
  1. db.col.find({},{"title":1,_id:0}).limit(2)      #  _id:0(投影1:表示显示0:表示隐藏)
  2. { "title" : "PHP 教程" }
  3. { "title" : "Java 教程" }
  4. 注:如果你们没有指定limit()方法中的参数则显示集合中的所有数据。
复制代码
7.MongoDB排序
  1. MongoDB sort()方法
  2. 在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
  3. 语法
  4. sort()方法基本语法如下所示:
  5. >db.COLLECTION_NAME.find().sort({KEY:1})
  6. 实例
  7. col 集合中的数据如下:
  8. { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
  9. { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
  10. { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
  11. 以下实例演示了 col 集合中的数据按字段 likes 的降序排列:
  12. >db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
  13. { "title" : "PHP 教程" }
  14. { "title" : "Java 教程" }
  15. { "title" : "MongoDB 教程" }
  16. >
复制代码
8.MongoDB索引

索引通常能够极大的进步查询的服从,假如没有索引,MongoDB在读取数据时必须扫描聚会合的每个文件并选取那些符合查询条件的记载。
这种扫描全聚集的查询服从黑白常低的,特殊在处置处罚大量的数据时,查询可以要花费几十秒乃至几分钟,这对网站的性能黑白常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据聚会合,索引是对数据库表中一列或多列的值进行排序的一种结构
ensureIndex() 方法
MongoDB利用 ensureIndex() 方法来创建索引。
语法
ensureIndex()方法根本语法格式如下所示:
  1. db.COLLECTION_NAME.ensureIndex({KEY:1})
  2. 语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。
复制代码
实例
  1. db.col.ensureIndex({"title":1})
复制代码
ensureIndex() 方法中你也可以设置利用多个字段创建索引(关系型数据库中称作复合索引)。
  1. db.col.ensureIndex({"title":1,"description":-1})
复制代码
ensureIndex() 吸收可选参数,可选参数列表如下:



实例在背景创建索引:
  1. db.values.ensureIndex({open: 1, close: 1}, {background: true})
复制代码
通过在创建索引时加background:true 的选项,让创建工作在背景执行

8.MongoDB 聚合

MongoDB中聚合(aggregate)主要用于处置处罚数据(诸如统计匀称值,求和等),并返回盘算后的数据效果。有点雷同sql语句中的 count(*)。
aggregate() 方法
MongoDB中聚合的方法利用aggregate()。
语法
aggregate() 方法的根本语法格式如下所示:
  1. db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
复制代码
实例
  1. 集合中的数据如下:
  2. {
  3.    _id: ObjectId(7df78ad8902c)
  4.    title: 'MongoDB Overview',
  5.    description: 'MongoDB is no sql database',
  6.    by_user: 'runoob.com',
  7.    url: 'http://www.runoob.com',
  8.    tags: ['mongodb', 'database', 'NoSQL'],
  9.    likes: 100
  10. },
  11. {
  12.    _id: ObjectId(7df78ad8902d)
  13.    title: 'NoSQL Overview',
  14.    description: 'No sql database is very fast',
  15.    by_user: 'runoob.com',
  16.    url: 'http://www.runoob.com',
  17.    tags: ['mongodb', 'database', 'NoSQL'],
  18.    likes: 10
  19. },
  20. {
  21.    _id: ObjectId(7df78ad8902e)
  22.    title: 'Neo4j Overview',
  23.    description: 'Neo4j is no sql database',
  24.    by_user: 'Neo4j',
  25.    url: 'http://www.neo4j.com',
  26.    tags: ['neo4j', 'database', 'NoSQL'],
  27.    likes: 750
  28. },
  29. 现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:
  30. ## _id 指定根据那个属性分组
  31. db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
  32. {
  33.    "result" : [
  34.       {
  35.          "_id" : "runoob.com",
  36.          "num_tutorial" : 2
  37.       },
  38.       {
  39.          "_id" : "Neo4j",
  40.          "num_tutorial" : 1
  41.       }
  42.    ],
  43.    "ok" : 1
  44. }
  45. 以上实例类似sql语句: select by_user, count(*) from mycol group by by_user
复制代码
在上面的例子中,我们通过字段by_user字段对数据进行分组,并盘算by_user字段相同值的总和。
下表展示了一些聚合的表达式:



管道的概念
管道在Unix和Linux中一样平常用于将当前下令的输出效果作为下一个下令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处置处罚完毕后将效果通报给下一个管道处置处罚。管道操纵是可以重复的。
表达式:处置处罚输入文档并输出。表达式是无状态的,只能用于盘算当前聚合管道的文档,不能处置处罚别的的文档。
这里我们先容一下聚合框架中常用的几个操纵:
project:修改输入文档的结构。可以用来重定名、增长或删除域,也可以用于创建盘算效果以及嵌套文档。 p r o j e c t : 修 改 输 入 文 档 的 结 构 。 可 以 用 来 重 命 名 、 增 加 或 删 除 域 , 也 可 以 用 于 创 建 计 算 结 果 以 及 嵌 套 文 档 。 match:用于过滤数据,只输出符合条件的文档。 match利用MongoDB的尺度查询操纵。 m a t c h 使 用 M o n g o D B 的 标 准 查 询 操 作 。 limit:用来限制MongoDB聚合管道返回的文档数。
skip:在聚合管道中跳过指定命目标文档,并返回余下的文档。 s k i p : 在 聚 合 管 道 中 跳 过 指 定 数 量 的 文 档 , 并 返 回 余 下 的 文 档 。 unwind:将文档中的某一个数组范例字段拆分成多条,每条包罗数组中的一个值。
group:将聚会合的文档分组,可用于统计效果。 g r o u p : 将 集 合 中 的 文 档 分 组 , 可 用 于 统 计 结 果 。 sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。
管道操纵符实例
  1. 1、$project实例
  2. db.article.aggregate(
  3.     { $project : {
  4.         title : 1 ,
  5.         author : 1 ,
  6.     }}
  7. );
  8. 这样的话结果中就只还有_id,tilte和author三个字段了,默认情况下_id字段是被包含的,如果要想不包含_id话可以这样:
  9. db.article.aggregate(
  10.     { $project : {
  11.         _id : 0 ,
  12.         title : 1 ,
  13.         author : 1
  14.     }});
  15. 2.$match实例
  16. db.articles.aggregate( [
  17.                         { $match : { score : { $gt : 70, $lte : 90 } } },
  18.                         { $group: { _id: null, count: { $sum: 1 } } }
  19.                        ] );
  20. $match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
  21. 3.$skip实例
  22. db.article.aggregate(
  23.     { $skip : 5 });
  24. 经过$skip管道操作符处理后,前五个文档被"过滤"掉。
复制代码
四 Python操纵MongoDB

安装PyMongo模块
  1. pip install pymongo
复制代码
利用MongoClient创建连接
  1. from pymongo import MongoClient
  2. #链接格式
  3. mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
  4. mongodb:// 这是固定的格式,必须要指定。
  5. username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库
  6. host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
  7. portX 可选的指定端口,如果不填,默认为27017
  8. /database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。
  9. ?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开
  10. # 以下为三种建立无验证连接的方式
  11. #client = MongoClient()
  12. #client = MongoClient('localhost', 27017)
  13. #client = MongoClient('mongodb://localhost:27017/')
  14. #建立验证连接
  15. 使用用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上。输出结果如下所示:
  16. > mongodb://admin:123456@localhost/
  17. ...
  18. 使用用户名和密码连接登陆到指定数据库,格式如下:
  19. mongodb://admin:123456@localhost/test
复制代码
获取数据库
  1. # 以下是两种获取数据库的方式
  2. db = client.pythondb
  3. db = client['python-db']
复制代码
获取聚集
  1. # 以下是两种获取集合的方式
  2. collection = db.python_collection
  3. collection = db['python-collection']
复制代码
上述任何下令都没有在MongoDB服务器上实际执行任何操纵。当第一个文档插入聚集时才创建聚集和数据库。
插入文档
  1. #!/usr/bin/python3
  2. #coding=utf-8
  3. import datetime
  4. from pymongo import MongoClient
  5. client = MongoClient()
  6. db = client.pythondb
  7. posts = db.posts
  8. post = {"author": "Maxsu",
  9.          "text": "My first blog post!",
  10.          "tags": ["mongodb", "python", "pymongo"],
  11.          "date": datetime.datetime.utcnow()}
  12. posts.insert(post)
复制代码
  1. # 批量插入,参数为list
  2. posts.insert_many(new_posts)
复制代码
查找文档
  1. #!/usr/bin/python3
  2. #coding=utf-8
  3. import datetime
  4. import pprint
  5. from pymongo import MongoClient
  6. client = MongoClient()
  7. db = client.pythondb
  8. posts = db.posts
  9. # 查找单个文档
  10. print(posts.find_one())
  11. # 查找多个文档
  12. for post in posts.find():
  13.     print(post)
  14. # 计数统计
  15. print(posts.count())
  16. print(posts.find({"author": "Maxsu"}).count())
复制代码
到此这篇关于MongoDB安装利用并实现Python操纵数据库 的文章就先容到这了,更多相干MongoDB安装利用内容请搜索脚本之家以前的文章或继承欣赏下面的相干文章盼望各人以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作