MongoDB 基础概念与操作解析

    xiaoxiao2022-07-07  229

    前言

    在前一章内MongoDB 安装(Mac), 我们介绍了基本的MongdoDB的安装. 本章我们继续接着上章的内容继续.

    最近眼疾较为严重, 所以许久没更新了. 各位, 在工作和生活的时候多进行运动, 多保护自己的身体. 不要被剥削和洗脑的太过严重!


    基本概念

    我们都知道, 在Mysql内,我们经常将操作语言分为DML和DDL. 前者为表的相关操作&权限的相关操作等. 后者, 主要基于创建的表进行CURD的操作. 其实, 个人认为, 在MongoDB的使用过程中, 完全也可以这样进行划分.

    在SQL型数据库内, 我们的一等公民为数据库-表-列-记录, 而在MondoDB内, 一等公民则为数据库-集合-列-文档

    其实这也不是特别难以理解. 引用Runoob的表格和图片来形容, 对比如下所示:

    SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引tablejoins表连接,MongoDB不支持primary keyprimary key主键,MongoDB自动将_id字段设置为主键


    基本操作(启动&客户端链接)

    关于MongoDB的启动与客户端的链接, 我们在上章已经提过了. 这边简单的提一下.

    启动 localhost:MongoDB Sean$ mongod --dbpath=/Users/Sean/Software/MongoDB/data/db 本地链接 localhost:~ Sean$ mongo MongoDB shell version v3.4.2 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.2 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2019-05-10T17:09:07.681+0800 I CONTROL [initandlisten] 2019-05-10T17:09:07.681+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2019-05-10T17:09:07.681+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2019-05-10T17:09:07.681+0800 I CONTROL [initandlisten]

    远程链接 mongo 192.168.100.21:27017 具体操作与链接的权限操作, 参考这篇文章. 这边就不详细讨论了. mongodb远程连接配置


    基本操作(集合&数据库相关操作)

    查看所有数据库 > show dbs admin 0.000GB local 0.000GB 查看当前使用的数据库 > db test 创建简单的对象&查看时间戳 > var newObject = ObjectId() > newObject.getTimestamp() ISODate("2019-05-10T09:16:13Z") > newObject.str 5cd5415de6b987425bc13717 创建新的数据库 > use yanxml switched to db yanxml > db yanxml > show dbs admin 0.000GB local 0.000GB > db yanxml # 可以看见 这边并没有真正创建数据库(需要数据库内填充数据后,才真正创建) > show dbs admin 0.000GB local 0.000GB > db.yanxml.insert({"name":"www.yanxml.com"}) WriteResult({ "nInserted" : 1 }) > show dbs admin 0.000GB local 0.000GB yanxml 0.000GB 查看Collection > show tables yanxml 创建Collection > db.createCollection("yanxml_collection") { "ok" : 1 } > show tables yanxml yanxml_collection 删除Collection > db.yanxml_collection.drop() true > show tables yanxml 创建固定长度的Collection # 这边是创建失败了 > show db.createCollection("mycol", { capped : true, autoIndexId : true, size : ... 6142800, max : 10000 } ) 2019-05-10T17:26:09.266+0800 E QUERY [thread1] SyntaxError: missing ) after argument list @(shellhelp2):1:45 > show tables yanxml > db.createCollection("mycol", { capped : true, autoIndexId : true, size : ... 6142800, max : 10000 } ) { "note" : "the autoIndexId option is deprecated and will be removed in a future release", "ok" : 1 } > show tables mycol yanxml >

    基本操作(CURD相关操作)

    插入文档(insert) db.COLLECTION_NAME.insert(document) # 示例 >db.col.insert({title: 'MongoDB 教程', by: 'yanxml', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }) 插入文档(save) db.col.save(document) # 示例 # 定义文档 > document=({title: 'MongoDB 教程', by: 'yanxml', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }); # 插入文档 > db.col.insert(document) WriteResult({ "nInserted" : 1 }) 更新文档 db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) # 示例 >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 输出信息

    参数说明:

    query : update的查询条件,类似sql update查询内where后面的。update : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql >* update查询内set后面的upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern :可选,抛出异常的级别。 删除文档 db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } ) # 示例 >db.col.remove({'title':'MongoDB 教程'}) WriteResult({ "nRemoved" : 2 }) # 删除了两条数据

    参数说明:

    query :(可选)删除的文档的条件。justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。writeConcern :(可选)抛出异常的级别。 删除所有数据 >db.col.remove({}) 查询文档 db.collection.find(query, projection) # 示例 db.col.find() query :可选,使用查询操作符指定查询条件projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。 查询文档(格式化读取) >db.col.find().pretty() 查询文档(Where) 操作格式范例RDBMS中的类似语句等于{<key>:<value>}db.col.find({“by”:“菜鸟教程”}).pretty()where by = ‘菜鸟教程’小于{<key>:{$lt:<value>}}db.col.find({“likes”:{$lt:50}}).pretty()where likes < 50小于或等于{<key>:{$lte:<value>}}db.col.find({“likes”:{$lte:50}}).pretty()where likes <= 50大于{<key>:{$gt:<value>}}db.col.find({“likes”:{$gt:50}}).pretty()where likes > 50大于或等于{<key>:{$gte:<value>}}db.col.find({“likes”:{$gte:50}}).pretty()where likes >= 50不等于{<key>:{$ne:<value>}}db.col.find({“likes”:{$ne:50}}).pretty()where likes != 50 查询文档(AND) >db.col.find({key1:value1, key2:value2}).pretty() # 示例 > db.col.find({"by":"教程", "title":"MongoDB 教程"}).pretty() 查询文档(OR) >db.col.find( { $or: [ {key1: value1}, {key2:value2} ] } ).pretty() # 示例 >db.col.find({$or:[{"by":"教程"},{"title": "MongoDB 教程"}]}).pretty() 查询文档(AND & OR) >db.col.find({"likes": {$gt:50}, $or: [{"by": "教程"},{"title": "MongoDB 教程"}]}).pretty() 查询文档(正则表达式) >db.posts.find({post_text:{$regex:"yanxml"}}) >db.posts.find({post_text:/yanxml/}) # 不区分大小写 >db.posts.find({post_text:{$regex:"yanxml",$options:"$i"}})

    Others

    更加深入的了解, 后面应当是:

    搜索正则表达式分片创建和管理数据库索引Java APIMongdoDB数据底层 & 与Mysql传统数据库底层B+树的区别

    由于本人用的不是特别多, 这部分的内容暂且挂起. 等有时间的时候进行研究.


    Reference

    [1]. MongoDB 教程

    最新回复(0)