赞
踩
目录
mongodb://admin:123456@localhost/test
db.createCollection(name, options)
db.COLLECTION_NAME.insert(document)或db.COLLECTION_NAME.save(document)
db.collection.insertOne() 用于向集合插入一个新文档,语法格式如下:
db.collection.insertMany() 用于向集合插入一个多个文档,语法格式如下:
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):
>db.col.remove({})>db.col.find()补充:
db.collection.find(query, projection)
MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
>db.col.find( { $or: [ {key1: value1}, {key2:value2} ] }).pretty()
MongoDB 使用 (<) 和 (>) 查询 - $lt 和 $gt
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。
db.col.find({"title" : {$type : 2}})或db.col.find({"title" : {$type : 'string'}})
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。
下表将帮助您更容易理解Mongo中的一些概念:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
通过下图实例,我们也可以更直观的了解Mongo中的一些概念:
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
"show dbs" 命令可以显示所有数据的列表。
- $ ./mongo
- MongoDB shell version: 3.0.6
- connecting to: test
- > show dbs
- local 0.078GB
- test 0.078GB
- >
执行 "db" 命令可以显示当前数据库对象或集合。
- $ ./mongo
- MongoDB shell version: 3.0.6
- connecting to: test
- > db
- test
- >
运行"use"命令,可以连接到一个指定的数据库。
- > use local
- switched to db local
- > db
- local
- >
以上实例命令中,"local" 是你要链接的数据库。
在下一个章节我们将详细讲解MongoDB中命令的使用。
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
一个简单的文档例子如下:
{"site":"www.runoob.com", "name":"菜鸟教程"}
下表列出了 RDBMS 与 MongoDB 对应的术语:
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表格 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | 主键 (MongoDB 提供了 key 为 _id ) |
数据库服务和客户端 | |
Mysqld/Oracle | mongod |
mysql/sqlplus | mongo |
需要注意的是:
文档键命名规范:
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
比如,我们可以将以下不同数据结构的文档插入到集合中:
- {"site":"www.baidu.com"}
- {"site":"www.google.com","name":"Google"}
- {"site":"www.runoob.com","name":"菜鸟教程","num":5}
当第一个文档插入时,集合就会被创建。
如下实例:
db.col.findOne()
Capped collections 就是固定大小的collection。
它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。
Capped collections 是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能和标准的 collection 不同,你必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字节。collection 的数据存储空间值提前分配的。
Capped collections 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections 中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。
由于 Capped collection 是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。MongoDB 的操作日志文件 oplog.rs 就是利用 Capped Collection 来实现的。
要注意的是指定的存储大小包含了数据库的头信息。
db.createCollection("mycoll", {capped:true, size:100000})
数据库的信息是存储在集合中。它们使用了系统的命名空间:
dbname.system.*
在MongoDB数据库中名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection),如下:
集合命名空间 | 描述 |
---|---|
dbname.system.namespaces | 列出所有名字空间。 |
dbname.system.indexes | 列出所有索引。 |
dbname.system.profile | 包含数据库概要(profile)信息。 |
dbname.system.users | 列出所有可访问数据库的用户。 |
dbname.local.sources | 包含复制对端(slave)的服务器信息和状态。 |
对于修改系统集合中的对象有如下限制。
在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{system.users}}是可修改的。 {{system.profile}}是可删除的。
下表为MongoDB中常用的几种数据类型。
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
下面说明下几种重要的数据类型。
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:
MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象
由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
- > var newObject = ObjectId()
- > newObject.getTimestamp()
- ISODate("2017-11-25T07:21:10Z")
ObjectId 转为字符串
- > newObject.str
- 5a1919e63df83ce79df8b38f
BSON 字符串都是 UTF-8 编码。
BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的 日期 类型不相关。 时间戳值是一个 64 位的值。其中:
序数
在单个 mongod 实例中,时间戳值通常是唯一的。
在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。
BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,你可以使用 BSON 日期类型。
表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的, 负数表示 1970 年之前的日期。
- > var mydate1 = new Date() //格林尼治时间
- > mydate1
- ISODate("2018-03-04T14:58:51.233Z")
- > typeof mydate1
- object
- > var mydate2 = ISODate() //格林尼治时间
- > mydate2
- ISODate("2018-03-04T15:00:45.479Z")
- > typeof mydate2
- object
这样创建的时间是日期类型,可以使用 JS 中的 Date 类型的方法。
返回一个时间类型的字符串:
- > var mydate1str = mydate1.toString()
- > mydate1str
- Sun Mar 04 2018 14:58:51 GMT+0000 (UTC)
- > typeof mydate1str
- string
或者
- > Date()
- Sun Mar 04 2018 15:02:59 GMT+0000 (UTC)
在前面的教程中,我们已经讨论了如何启动 MongoDB 服务,你只需要在 MongoDB 安装目录的 bin 目录下执行 mongodb 即可。
执行启动操作后,mongodb 在输出一些必要信息后不会输出任何信息,之后就等待连接的建立,当连接被建立后,就会开始打印日志信息。
你可以使用 MongoDB shell 来连接 MongoDB 服务器。你也可以使用 PHP 来连接 MongoDB。本教程我们会使用 MongoDB shell 来连接 Mongodb 服务,之后的章节我们将会介绍如何通过php 来连接MongoDB服务。
标准 URI 连接语法:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 这是固定的格式,必须要指定。
username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库
host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
portX 可选的指定端口,如果不填,默认为27017
/database 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库。
?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开
标准的连接格式包含了多个选项(options),如下所示:
选项 | 描述 |
---|---|
replicaSet=name | 验证replica set的名称。 Impliesconnect=replicaSet. |
slaveOk=true|false |
|
safe=true|false |
|
w=n | 驱动添加 { w : n } 到getLastError命令. 应用于safe=true。 |
wtimeoutMS=ms | 驱动添加 { wtimeout : ms } 到 getlasterror 命令. 应用于 safe=true. |
fsync=true|false |
|
journal=true|false | 如果设置为 true, 同步到 journal (在提交到数据库前写入到实体中). 应用于 safe=true |
connectTimeoutMS=ms | 可以打开连接的时间。 |
socketTimeoutMS=ms | 发送和接受sockets的时间。 |
使用默认端口来连接 MongoDB 的服务。
mongodb://localhost
通过 shell 连接 MongoDB 服务:
- $ ./mongo
- MongoDB shell version: 4.0.9
- connecting to: test
- ...
这时候你返回查看运行 ./mongod 命令的窗口,可以看到是从哪里连接到MongoDB的服务器,您可以看到如下信息:
- ……省略信息……
- 2015-09-25T17:22:27.336+0800 I CONTROL [initandlisten] allocator: tcmalloc
- 2015-09-25T17:22:27.336+0800 I CONTROL [initandlisten] options: { storage: { dbPath: "/data/db" } }
- 2015-09-25T17:22:27.350+0800 I NETWORK [initandlisten] waiting for connections on port 27017
- 2015-09-25T17:22:36.012+0800 I NETWORK [initandlisten] connection accepted from 127.0.0.1:37310 #1 (1 connection now open) # 该行表明一个来自本机的连接
-
- ……省略信息……
使用用户名和密码连接到 MongoDB 服务器,你必须使用 'username:password@hostname/dbname' 格式,'username'为用户名,'password' 为密码。
使用用户名和密码连接登录到默认数据库:
- $ ./mongo
- MongoDB shell version: 4.0.9
- connecting to: test
使用用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上。输出结果如下所示:
- > mongodb://admin:123456@localhost/
- ...
使用用户名和密码连接登录到指定数据库,格式如下:
连接本地数据库服务器,端口是默认的。
mongodb://localhost
使用用户名fred,密码foobar登录localhost的admin数据库。
mongodb://fred:foobar@localhost
使用用户名fred,密码foobar登录localhost的baz数据库。
mongodb://fred:foobar@localhost/baz
连接 replica pair, 服务器1为example1.com服务器2为example2。
mongodb://example1.com:27017,example2.com:27017
连接 replica set 三台服务器 (端口 27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019
连接 replica set 三台服务器, 写入操作应用在主服务器 并且分布查询到从服务器。
mongodb://host1,host2,host3/?slaveOk=true
直接连接第一个服务器,无论是replica set一部分或者主服务器或者从服务器。
mongodb://host1,host2,host3/?connect=direct;slaveOk=true
当你的连接服务器有优先级,还需要列出所有服务器,你可以使用上述连接方式。
安全模式连接到localhost:
mongodb://localhost/?safe=true
以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
MongoDB 创建数据库的语法格式如下:
以下实例我们创建了数据库 runoob:
- > use runoob
- switched to db runoob
- > db
- runoob
- >
如果你想查看所有数据库,可以使用 show dbs 命令:
- > show dbs
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- >
可以看到,我们刚创建的数据库 runoob 并不在数据库的列表中, 要显示它,我们需要向 runoob 数据库插入一些数据。
- > db.runoob.insert({"name":"菜鸟教程"})
- WriteResult({ "nInserted" : 1 })
- > show dbs
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- runoob 0.000GB
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中。
MongoDB 删除数据库的语法格式如下:
删除当前数据库,默认为 test,你可以使用 db 命令查看当前数据库名。
以下实例我们删除了数据库 runoob。
首先,查看所有数据库:
- > show dbs
- admin 0.000GB
- config 0.000GB
- local 0.000GB
- runoob 0.000GB
接下来我们切换到数据库 runoob:
- > use runoob
- switched to db runoob
- >
执行删除命令:
- > db.dropDatabase()
- { "dropped" : "runoob", "ok" : 1 }
最后,我们再通过 show dbs 命令数据库是否删除成功:
- > show dbs
- admin 0.000GB
- config 0.000GB
- local 0.000GB
集合删除语法格式如下:
以下实例删除了 runoob 数据库中的集合 site:
- > use runoob
- switched to db runoob
- > db.createCollection("runoob") # 先创建集合,类似数据库中的表
- > show tables # show collections 命令会更加准确点
- runoob
- > db.runoob.drop()
- true
- > show tables
- >
MongoDB 中使用 createCollection() 方法来创建集合。
语法格式:
参数说明:
options 可以是如下参数:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。 |
autoIndexId | 布尔 | 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。 |
size | 数值 | (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。
在 test 数据库中创建 runoob 集合:
- > use test
- switched to db test
- > db.createCollection("runoob")
- { "ok" : 1 }
- >
如果要查看已有集合,可以使用 show collections 或 show tables 命令:
- > show collections
- runoob
- system.indexes
下面是带有几个关键参数的 createCollection() 的用法:
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
- > db.createCollection("mycol", { capped : true, autoIndexId : true, size :
- 6142800, max : 10000 } )
- { "ok" : 1 }
- >
在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
- > db.mycol2.insert({"name" : "菜鸟教程"})
- > show collections
- mycol2
- ...
MongoDB 中使用 drop() 方法来删除集合。
语法格式:
db.collection.drop()
参数说明:
返回值
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
在数据库 mydb 中,我们可以先通过 show collections 命令查看已存在的集合:
- >use mydb
- switched to db mydb
- >show collections
- mycol
- mycol2
- system.indexes
- runoob
- >
接着删除集合 mycol2 :
- >db.mycol2.drop()
- true
- >
通过 show collections 再次查看数据库 mydb 中的集合:
- >show collections
- mycol
- system.indexes
- runoob
- >
从结果中可以看出 mycol2 集合已被删除。
文档的数据结构和 JSON 基本一样。
所有存储在集合中的数据都是 BSON 格式。
BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
3.2 版本之后新增了 db.collection.insertOne() 和 db.collection.insertMany()。
- db.collection.insertOne(
- <document>,
- {
- writeConcern: <document>
- }
- )
- db.collection.insertMany(
- [ <document 1> , <document 2>, ... ],
- {
- writeConcern: <document>,
- ordered: <boolean>
- }
- )
参数说明:
以下文档可以存储在 MongoDB 的 runoob 数据库 的 col 集合中:
- >db.col.insert({title: 'MongoDB 教程',
- description: 'MongoDB 是一个 Nosql 数据库',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['mongodb', 'database', 'NoSQL'],
- likes: 100
- })
以上实例中 col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
查看已插入文档:
- > db.col.find()
- { "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
- >
我们也可以将数据定义为一个变量,如下所示:
- > document=({title: 'MongoDB 教程',
- description: 'MongoDB 是一个 Nosql 数据库',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['mongodb', 'database', 'NoSQL'],
- likes: 100
- });
执行后显示结果如下:
- {
- "title" : "MongoDB 教程",
- "description" : "MongoDB 是一个 Nosql 数据库",
- "by" : "菜鸟教程",
- "url" : "http://www.runoob.com",
- "tags" : [
- "mongodb",
- "database",
- "NoSQL"
- ],
- "likes" : 100
- }
执行插入操作:
- > db.col.insert(document)
- WriteResult({ "nInserted" : 1 })
- >
插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。
update() 方法用于更新已存在的文档。语法格式如下:
- db.collection.update(
- <query>,
- <update>,
- {
- upsert: <boolean>,
- multi: <boolean>,
- writeConcern: <document>
- }
- )
参数说明:
我们在集合 col 中插入如下数据:
- >db.col.insert({
- title: 'MongoDB 教程',
- description: 'MongoDB 是一个 Nosql 数据库',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['mongodb', 'database', 'NoSQL'],
- likes: 100
- })
接着我们通过 update() 方法来更新标题(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 输出信息 > db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } >
可以看到标题(title)由原来的 "MongoDB 教程" 更新为了 "MongoDB"。
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
- db.collection.save(
- <document>,
- {
- writeConcern: <document>
- }
- )
参数说明:
以下实例中我们替换了 _id 为 56064f89ade2f21f36b03136 的文档数据:
- >db.col.save({
- "_id" : ObjectId("56064f89ade2f21f36b03136"),
- "title" : "MongoDB",
- "description" : "MongoDB 是一个 Nosql 数据库",
- "by" : "Runoob",
- "url" : "http://www.runoob.com",
- "tags" : [
- "mongodb",
- "NoSQL"
- ],
- "likes" : 110
- })
替换成功后,我们可以通过 find() 命令来查看替换后的数据
- >db.col.find().pretty()
- {
- "_id" : ObjectId("56064f89ade2f21f36b03136"),
- "title" : "MongoDB",
- "description" : "MongoDB 是一个 Nosql 数据库",
- "by" : "Runoob",
- "url" : "http://www.runoob.com",
- "tags" : [
- "mongodb",
- "NoSQL"
- ],
- "likes" : 110
- }
- >
MongoDB remove()函数是用来移除集合中的数据。
MongoDB数据更新可以使用update()函数。在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较好的习惯。
remove() 方法的基本语法格式如下所示:
- db.collection.remove(
- <query>,
- <justOne>
- )
如果你的 MongoDB 是 2.6 版本以后的,语法格式如下:
- db.collection.remove(
- <query>,
- {
- justOne: <boolean>,
- writeConcern: <document>
- }
- )
参数说明:
以下文档我们执行两次插入操作:
- >db.col.insert({title: 'MongoDB 教程',
- description: 'MongoDB 是一个 Nosql 数据库',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['mongodb', 'database', 'NoSQL'],
- likes: 100
- })
使用 find() 函数查询数据:
- > db.col.find()
- { "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
- { "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
接下来我们移除 title 为 'MongoDB 教程' 的文档:
- >db.col.remove({'title':'MongoDB 教程'})
- WriteResult({ "nRemoved" : 2 }) # 删除了两条数据
- >db.col.find()
- …… # 没有数据
remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法。
如删除集合下全部文档:
db.inventory.deleteMany({})
删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })
删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )
remove() 方法 并不会真正释放空间。
需要继续执行 db.repairDatabase() 来回收磁盘空间。
- > db.repairDatabase()
- 或者
- > db.runCommand({ repairDatabase: 1 })
MongoDB 查询文档使用 find() 方法。
find() 方法以非结构化的方式来显示所有文档。
MongoDB 查询数据的语法格式如下:
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
pretty() 方法以格式化的方式来显示所有文档。
以下实例我们查询了集合 col 中的数据:
- > db.col.find().pretty()
- {
- "_id" : ObjectId("56063f17ade2f21f36b03133"),
- "title" : "MongoDB 教程",
- "description" : "MongoDB 是一个 Nosql 数据库",
- "by" : "菜鸟教程",
- "url" : "http://www.runoob.com",
- "tags" : [
- "mongodb",
- "database",
- "NoSQL"
- ],
- "likes" : 100
- }
除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
操作 | 格式 | 范例 | 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 |
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
以下实例通过 by 和 title 键来查询 菜鸟教程 中 MongoDB 教程 的数据
- > db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"}).pretty()
- {
- "_id" : ObjectId("56063f17ade2f21f36b03133"),
- "title" : "MongoDB 教程",
- "description" : "MongoDB 是一个 Nosql 数据库",
- "by" : "菜鸟教程",
- "url" : "http://www.runoob.com",
- "tags" : [
- "mongodb",
- "database",
- "NoSQL"
- ],
- "likes" : 100
- }
以上实例中类似于 WHERE 语句:WHERE by='菜鸟教程' AND title='MongoDB 教程'
以下实例中,我们演示了查询键 by 值为 菜鸟教程 或键 title 值为 MongoDB 教程 的文档。
- >db.col.find({$or:[{"by":"菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
- {
- "_id" : ObjectId("56063f17ade2f21f36b03133"),
- "title" : "MongoDB 教程",
- "description" : "MongoDB 是一个 Nosql 数据库",
- "by" : "菜鸟教程",
- "url" : "http://www.runoob.com",
- "tags" : [
- "mongodb",
- "database",
- "NoSQL"
- ],
- "likes" : 100
- }
- >
以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: 'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'
>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "菜鸟教程",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
条件操作符用于比较两个表达式并从mongoDB集合中获取数据。
在本章节中,我们将讨论如何在MongoDB中使用条件操作符。
MongoDB中条件操作符有:
我们使用的数据库名称为"runoob" 我们的集合名称为"col",以下为我们插入的数据。
为了方便测试,我们可以先使用以下命令清空集合 "col" 的数据:
db.col.remove({})
插入以下数据
- >db.col.insert({
- title: 'PHP 教程',
- description: 'PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['php'],
- likes: 200
- })
- >db.col.insert({title: 'Java 教程',
- description: 'Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['java'],
- likes: 150
- })
- >db.col.insert({title: 'MongoDB 教程',
- description: 'MongoDB 是一个 Nosql 数据库',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['mongodb'],
- likes: 100
- })
- > db.col.find()
- { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
- { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
- { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
如果你想获取 "col" 集合中 "likes" 大于 100 的数据,你可以使用以下命令:
db.col.find({likes : {$gt : 100}})
类似于SQL语句:
Select * from col where likes > 100;
输出结果:
- > db.col.find({likes : {$gt : 100}})
- { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
- { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
- >
如果你想获取"col"集合中 "likes" 大于等于 100 的数据,你可以使用以下命令:
db.col.find({likes : {$gte : 100}})
类似于SQL语句:
Select * from col where likes >=100;
输出结果:
- > db.col.find({likes : {$gte : 100}})
- { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
- { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
- { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
- >
如果你想获取"col"集合中 "likes" 小于 150 的数据,你可以使用以下命令:
db.col.find({likes : {$lt : 150}})
类似于SQL语句:
Select * from col where likes < 150;
输出结果:
- > db.col.find({likes : {$lt : 150}})
- { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
如果你想获取"col"集合中 "likes" 小于等于 150 的数据,你可以使用以下命令:
db.col.find({likes : {$lte : 150}})
类似于SQL语句:
Select * from col where likes <= 150;
输出结果:
- > db.col.find({likes : {$lte : 150}})
- { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
- { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
如果你想获取"col"集合中 "likes" 大于100,小于 200 的数据,你可以使用以下命令:
db.col.find({likes : {$lt :200, $gt : 100}})
Select * from col where likes>100 AND likes<200;
输出结果:
- > db.col.find({likes : {$lt :200, $gt : 100}})
- { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
- >
补充:
- $gt -------- greater than >
-
- $gte --------- gt equal >=
-
- $lt -------- less than <
-
- $lte --------- lt equal <=
-
- $ne ----------- not equal !=
-
- $eq -------- equal =
模糊查询:
查询 title 包含"教"字的文档:
查询 title 字段以"教"字开头的文档:
查询 titl e字段以"教"字结尾的文档:
在本章节中,我们将继续讨论MongoDB中条件操作符 $type。
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃。 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
我们使用的数据库名称为"runoob" 我们的集合名称为"col",以下为我们插入的数据。
简单的集合"col":
- >db.col.insert({
- title: 'PHP 教程',
- description: 'PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['php'],
- likes: 200
- })
- >db.col.insert({title: 'Java 教程',
- description: 'Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['java'],
- likes: 150
- })
- >db.col.insert({title: 'MongoDB 教程',
- description: 'MongoDB 是一个 Nosql 数据库',
- by: '菜鸟教程',
- url: 'http://www.runoob.com',
- tags: ['mongodb'],
- likes: 100
- })
使用find()命令查看数据:
- > db.col.find()
- { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
- { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
- { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:
输出结果为:
- { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
- { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
- { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数。
limit()方法基本语法如下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)
集合 col 中的数据如下:
- { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
- { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
- { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
以下实例为显示查询文档中的两条记录:
- > db.col.find({},{"title":1,_id:0}).limit(2)
- { "title" : "PHP 教程" }
- { "title" : "Java 教程" }
- >
注:如果你们没有指定limit()方法中的参数则显示集合中的所有数据。
我们除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数。
skip() 方法脚本语法格式如下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
以下实例只会显示第二条文档数据
- >db.col.find({},{"title":1,_id:0}).limit(1).skip(1)
- { "title" : "Java 教程" }
- >
注:skip()方法默认参数为 0 。
注:
大道至简,知其然必知其所以然。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。