MongoDB初探第二篇

与sql语句的简单对比
在第一篇中分享了一些MongoDB的基本知识点,因为安装运行其实都还是很轻巧的,所以对于大家上手来说应该问题不大,但是安装完成,数据库也可以连接了,但是MongoDB中是没有办法运行sql语句的。这个时候关系型数据库中的一些思维直接移植过来就不适用了,但是大道至简,其实道理还是相同的,对于的数据的操作可以通过api来完成,这个从某种程度上来说,是MongoDB的亮点也是另外一种优势。
我简单的总结了一下常用的sql语句的一些用法在MongoDB中改怎么使用。
首先一个很大的不同是,在MongoDB中,没有表的概念,都是以collection为基本的单位存储的。可以通过show collections来查看当前的数据库中存在的collections
> show collections
startup_log
system.indexes
system.profile

我们来看看增删改查的用法。
insert
原本sql语句中的类似下面的语句
insert into test values(100,'test1');
在MongoDB中可以使用如下的方式来实现,我们多插入一些数据。
db.test.insert({id:11,name:"test1"});
db.test.insert({id:12,name:"test2"});
db.test.insert({id:13,name:"test3"});
db.test.insert({id:14,name:"test4"});
db.test.insert({id:15,name:"test5"});
db.test.insert({id:16,name:"test6"});
查看一下数据的情况。
> db.test.find();
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 13, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }
这个时候查看collections会发现,已经创建好了这个collection
> show collections
startup_log
system.indexes
system.profile
test
还有一种插入方式,如果注意到上面的数据话,会发现有一个隐含列_id,如果需要手动指定_id列的值,可以使用save方法。
> db.test.save({_id:100001,id:11,name:"test_new"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 100001 })
查看新插入的数据,注意_id的值
> db.test.find();
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 13, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }
{ "_id" : 100001, "id" : 11, "name" : "test_new" }

delete

如果需要删除_id为100001的列的话,可以使用如下的方法
> db.test.remove({_id:100001})
WriteResult({ "nRemoved" : 1 })
> db.test.find();
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 13, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

update
我们尝试修改name列为test3的数据,修改id为18
> db.test.update({name:"test3"},{$set:{id:18}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test.find();
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

or的使用方法
在sql where字句中,经常会有or这样的过滤条件
我们来简单模拟一下 name为test或者name为test2的数据
> db.test.find({"$or":[{name:"test1"},{name:"test2"}]})  
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }

and的使用方法
我们来模拟一下name为test1并且name为test2这样的数据,这样的数据应该不存在,以下是一个错误的例子。
> db.test.find({name:"test1"},{name:"test2"})
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "name" : "test1" }
正确的用法应该这么写。
模拟name为test1并且id为11的数据
> db.test.find({"$and":[{name:"test1"},{id:11}]})
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }

rownum
>  db.test.find().limit(2);
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }

count
> db.test.count();
6

order by 

注意排序的情况
>  db.test.find().sort({name:-1})                                            
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
> db.test.find().sort({name:1})  
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

in 的使用
得到name在test1,test2,test3的数据 
> db.test.find({'name' : {'$in' : ["test1", "test2", "test3"]}});
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
>

not in的使用
> db.test.find({'name' : {'$nin' : ["test1", "test2", "test3"]}});
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

大于等于。。的使用
id大于14的数据
> db.test.find({id: {$gte: 14}});
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

like的使用 
> db.test.find({name:/5/});
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
 
distinct
distinct的使用,不过和sql中还是存在一定的差距,有点mapreduce的味道。
> db.test.distinct('name');
[ "test1", "test2", "test3", "test4", "test5", "test6" ]

时间: 2024-10-14 12:07:07

MongoDB初探第二篇的相关文章

mongoDB初探第一篇

早就久仰mongoDB大名,一直没有决心开始学习,从昨天开始尝试了一把,发现真是轻巧,熟悉了oracle之后,去看mysql,发现mysql真是够轻量级的,结果再看mongoDB,更加感觉轻量级. 一般数据库的安装都是复杂,繁琐,都是需要一些配置的,有些还要一些第三方软件依赖等等. 学习mongoDB感觉真是太轻巧了.感觉就是一个解压这么简单. 虽然简单但是过程总是艰辛的,也碰到一些大大小小的问题,有些问题让人丈二和尚抓不着头脑,庆幸的是在今天都解决了大部分,在此分享. 安装mongoDB,可以

【实战HTML5与CSS3 第二篇】绚丽的快速导航!

原文 http://www.cnblogs.com/yexiaochai/archive/2013/05/01/3051632.html 目录 [实战HTML5与CSS3 第一篇]初探水深,美丽的导航,绚丽的图片爆炸!! [实战HTML5与CSS3 第二篇]绚丽的快速导航! [实战HTML5与CSS3 第三篇]我第一个HTML5网页诞生了(提供源码) 前言 今天9点就起来了,因为下午出去有个聚会,所以就早点起来进行,否则这个进度有点吃紧啊,昨天初略的完成了导航以及爆炸的图片,这里来回顾下: 1

ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

很感谢大家给我的第一篇ASP.NET控件开发的支持!在写这些之前,我也看了一些例子,想选中一些好 上手的例子,这样,可能一些例子大家以前都见过,但是我想说:同样是弹钢琴,同样一首"命运交响曲 ",有的人弹的让人荡气回肠,有的人弹的就很一般. 受了李建忠老师的启发,发现用一种演化式的让人更好的接受. 好了,废话不说了.继续开发!希望大家支持! 我们之前开发了一个很简单的自定义的控件,方法很简单,只是把原来的html文本传入 writer.Writer()方法的参数,然后输出.其实从模式的

JavaWeb开发入门第二篇Tomcat服务器配置讲解_java

一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml配置文件中的Connector节点进行的端口修改 例如:将Tomcat服务器的启动端口由默认的8080改成8081端口 Tomcat服务器启动端口默认配置 <Connector port="8080" protocol="HTTP/1.1" connectionT

「C语言回顾之旅」第二篇:指针详解进阶

说明:     第一篇回顾了指针的基本概念以及基本使用,因此对指针也有了一个较为清晰的思路,但实际上第一篇关于指针的内容是不太容易忘记的.这是第二篇中的内容是比较容易混淆,但对于指针的进一步学习也是非常重要的. 一.指向函数的指针 1.函数指针 ·函数指针即指向函数的指针,函数指针值为函数的入口地址,通过使用该指针,即可以使用该函数: ·编写一个程序返回两个数的最大值,通过函数指针调用函数: a.main函数代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Android开源项目第二篇——工具库篇

Android开源项目第二篇--工具库篇 本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多媒体相关及其他.   最新内容请访问AndroidOpenProject@Github,欢迎Star和Fork.   Android开源项目系列汇总已完成,包括: Android开源项目第一篇--个性化控件(View)篇Android开源项目第二篇--工具库

CoreOS Fest 系列之第二篇: Systemd、Go、Calico、Sysdig

本文讲的是CoreOS Fest 系列之第二篇: Systemd.Go.Calico.Sysdig,[编者的话]在 CoreOS Fest 第二天的会议中,演讲者展示了多个开源项目和工具,包括 Systemd 和 CoreOS . Go 语言和容器. Calico 项目. Sysdig 等. 在 CoreOS Fest 的第一天会议中,陆续介绍了 CoreOS 的架构.规划和规范.第二天的会议,演讲者展示了多个开源项目和工具,包括 systemd-nspawn . Calico 项目和 Sysd

深入理解javascript作用域第二篇之词法作用域和动态作用域_javascript技巧

前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作模型导致的,作用域分为词法作用域和动态作用域,分清这两种作用域模型就能够对变量查找过程有清晰的认识.本文是深入理解javascript作用域系列第二篇--词法作用域和动态作用域 词法作用域 第一篇介绍过,编译器的第一个工作阶段叫作分词,就是把由字符组成的字符串分解成词法单元.这个概念是理解词法作用域

第二篇Bootstrap起步_javascript技巧

在上篇文章给大家介绍了Bootstrap的基础知识,接下来通过本文给大家介绍 我们可以在http://getbootstrap.com下载bootstrap的文件 点击左边的download bootstrap可以下载bootstrap的css,javascript和字体库的已编译版本.点击中间的download source可以下载bootstrap的源代码.一般情况下我们使用bootstrap点击左边的已编译版本下载就可以了. 如果下载的是已编译版结构是: 如果下载的是源代码结构是: Dis