前言很多开发者都是第一次接触数据库的概念(一般是大学课??堂),或者说第一个数据库,一般是SQL数据库,现在,NoSQL数据库正在迎头赶上,很多原有SQL数据的用户,难免会有转用NoSQL的需求。作为NoSQL数据库的代表,MongoDB在社区中越来越受欢迎,在生产环境中也得到了广泛的应用。对于从SQL切换到NoSQL的开发者来说,最困难的一步是直接复用原有的SQL概念和知识,以最大限度地降低学习成本。其实MongoDB官方已经为大家考虑了这一步,即:MongoDBCRUDOperations>MongoDBCRUDOperations>SQLtoMongoDBMappingChart,这个文档很好的总结了MongoDB对应的SQL的术语和概念,还有可执行文件、SQL语句/MongoDB语句等。可以说,对于SQL数据库的开发者来说,如果了解了它们之间的对应关系,那么就将一只脚跨入了MongoDB的大门。术语和概念下表描述了各种SQL术语和概念以及相应的MongoDB术语和概念。提示在许多情况下,非规范化数据模型(嵌入式文档和数组)将继续是您的数据和用例的最佳选择,而不是多文档事务。也就是说,对于许多场景,正确地建模数据将最大限度地减少对多文档事务的需求。下表可执行文件显示了一些数据库可执行文件和相应的MongoDB可执行文件。此列表并不详尽。示例下表显示了各种SQL语句和相应的MongoDB语句。表中的示例假设如下:Sql示例假设有一个名为people的表。MongoDB示例假设一个名为people的集合包含具有以下原型的文档:{_id:ObjectId("509a8fb2f3f4948bd2f983a0"),user_id:"abc123",age:55,status:'A'}CreateandAlterCREATETABLESQLschemastatement:CREATETABLEpeople(idMEDIUMINTNOTNULLAUTO_INCREMENT,user_idVarchar(30),ageNumber,statuschar(1),PRIMARYKEY(id))MongoDB模式语句:db.people.insertOne({user_id:"abc123",age:55,status:"A"})在隐式在insertOne()或insertMany()操作上创建。如果没有指定_id字段,则自动添加主键_id。但是,您也可以显式创建集合:db.createCollection("people")ALTERTABLE/ADDSQL模式语句:ALTERTABLEpeopleADDjoin_dateDATETIMEMongoDB模式语句:db.people.updateMany({},{$set:{join_date:newDate())}})该集合不描述或强制执行其文档的结构;也就是说,集合级别没有结构变化。但是,在文档级别,updateMany()操作可以使用$set运算符将字段添加到现有文档。ALTERTABLE/DROPCOLUMNSQL模式语句:ALTERTABLEpeopleDROPCOLUMNjoin_dateMongoDB模式语句:db.people.updateMany({},{$unset:{"join_date":""}})集合不描述或强制执行其文档的结构;也就是说,集合级别没有结构变化。但是,在文档级别,updateMany()操作可以使用$unset运算符从文档中删除字段。CREATEINDEXSQL模式语句:CREATEINDEXidx_user_id_ascONpeople(user_id)MongoDB模式语句:db.people.createIndex({user_id:1})CREATEINDEX/MultiSQL模式语句:CREATEINDEXidx_user_id_asc_age_descONpeople(user_id,ageDESC)MongoDB模式语句:db.people.create_Index:1,age:-1})DROPTABLESQL模式语句:DROPTABLEpeopleMongoDB模式语句:db.people.drop()Insert下表显示了各种SQL语句和对应的与向表中插入记录相关的MongoDB语句。SQLINSERT语句INSERTINTOpeople(user_id,age,status)VALUES("bcd001",45,"A")MongodbinsertOne()语句db.people.insertOne({user_id:"bcd001",age:45,status:"A"})Select下表是从表中读取记录相关的各种SQL语句和对应的MongoDB语句。注意:find()方法总是在返回的文档中包含_id字段,除非投影特别排除。下面的一些SQL查询可能包含一个_id字段来反映这一点,即使该字段未包含在相应的find()查询中。SELECT...WHERESQL语句SELECTuser_id,statusFROMpeopleWHEREstatus="A"Mongodb语句db.people.find({status:"A"},{user_id:1,status:1,_id:0})SELECT...ANDSQL语句SELECT*FROMpeopleWHEREage>25ANDage<=50Mongodb语句db.people.find({age:{$gt:25,$lte:50}})SELECT...ORSQL语句SELECT*FROMpeopleWHEREstatus="A"ORage=50Mongodb语句db.people.find({$or:[{status:"A"},{age:50}]})SELECT...LIKESQL语句FROMpeopleWHEREuser_idlike"%bc%"Mongodb语句db.people.find({user_id:/bc/})-or-db.people.find({user_id:{$regex:/bc/}})SELECT...OEDERBYSQL语句SELECT*FROMpeopleWHEREstatus="A"ORDERBYuser_idASCMongodb语句db.people.find({status:"A"}).sort({user_id:1})SELECT...COUNTSQL语句SELECTCOUNT(user_id)FROMpeopleMongodb语句db.people.count({user_id:{$exists:true}})ordb.people.find({user_id:{$exists:true}}).count()SELECTDISTINCTSQL语句SELECTDISTINCT(status)FROMpeopleMongodb语句db.people.aggregate([{$group:{_id:"$status"}}])或者,对于不超过[BSON大小限制]的一组不同的值(https://docs.mongodb.com/manual/reference/limits/#limit-bson-document-size)db.people.distinct("status")SELECT...LIMITSKIPSQL语句SELECT*FROMpeopleLIMIT5SKIP10Mongodb语句db.people.find().limit(5).skip(10)EXPLAINSELECTSQL语句EXPLAINSELECT*FROMpeopleWHEREstatus="A》Mongodb语句db.people.find({status:"A"}).explain()UpdateRecords下面展示了更新表中已有记录相关的各种SQL语句以及对应的MongoDB语句UPDATE...SETSQL语句UPDATEpeopleSETstatus="C"WHEREage>25Mongodb语句db.people.updateMany({age:{$gt:25}},{$set:{status:"C"}})UPDATE...INCSQL语句UPDATEpeopleSETage=age+3WHEREstatus="A"Mongodb语句db.people.updateMany({status:"A"},{$inc:{age:3}})删除记录表中删除记录相关的各种SQL语句和对应的MongoDB语句如下所示.DELETEWHERESQL语句DELETEFROMpeopleWHEREstatus="D"Mongodb语句db.people.deleteMany({status:"D"})DELETESQL语句DELETEFROMpeopleMongodb语句db.people.deleteMany({})看到这里,你心里一定有相关的SQL了MongoDB的知识和MongoDB的知识是一一对应的,所以剩下的就需要大家多多实践,深入挖掘。
