简介
MongoDB 是非关系型数据库。支持的数据结构非常松散,是类似 json 的 bson 格式,因此可以存储比较复杂的数据类型。采用面向集合的存储,在 MongoDB 中,一个数据库包含多个集合,类似于 MySQL 中一个数据库包含多个表;一个集合包含多个文档,类似于 MySQL 中一个表包含多条数据。
数据库的创建和删除
使用 use
命令可以连接到指定的数据库或者创建数据库(不存在时):
> use mydb
查看当前连接的数据库:
> db
查看所有的数据库:
> show dbs
列出的所有数据库中看不到 mydb
或者显示 mydb(empty)
,因为 mydb
为空,里面没有任何东西,MongoDB 不显示或显示 mydb(empty)
。
使用 db.dropDatabase()
删除数据库:
> use local
switched to db local
> db.dropDatabase()
集合(collection)的创建和删除
在数据库 mydb
中创建一个集合
> use mydb
switched to db mydb
> db.createCollection("users")
查看创建的集合:
> show collections
或者
> show tables
删除集合(删除 users
集合):
> db.users.drop()
向集合中插入文档
使用 insert()
插入数据时,如果 users
集合没有创建会自动创建。
> use mydb
switched to db mydb
> db.users.insert([{name: 'tom', email: 'tom@qq.com'}, {name: 'jack', email: 'jack@qq.com'}])
查询文档
> db.post.insert([{
... title: 'MongoDB Overview',
... description: 'MongoDB is no sql database',
... by: 'tom',
... url: 'http://www.zhihu.com',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 100
... }, {
... title: 'NoSQL Database',
... description: "NoSQL database doesn't have tables",
... by: 'jack',
... url: 'http://www.zhihu.com',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 20,
... comments: [{
... user: 'user1',
... message: 'My first comment',
... dateCreated: new Date(2013, 11, 10, 2, 35),
... like: 0
... }]
... }])
> db.post.find()
{ "_id" : ObjectId("57dfad717c8486a21f40f529"), "title" : "MongoDB Overview", "d
escription" : "MongoDB is no sql database", "by" : "tom", "url" : "http://www.zh
ihu.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("57dfad717c8486a21f40f52a"), "title" : "NoSQL Database", "des
cription" : "NoSQL database doesn't have tables", "by" : "jack", "url" : "http:/
/www.zhihu.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 20, "com
ments" : [ { "user" : "user1", "message" : "My first comment", "dateCreated" : I
SODate("2013-12-09T18:35:00Z"), "like" : 0 } ] }
> db.post.find().pretty()
{
"_id" : ObjectId("57dfad717c8486a21f40f529"),
"title" : "MongoDB Overview",
"description" : "MongoDB is no sql database",
"by" : "tom",
"url" : "http://www.zhihu.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("57dfad717c8486a21f40f52a"),
"title" : "NoSQL Database",
"description" : "NoSQL database doesn't have tables",
"by" : "jack",
"url" : "http://www.zhihu.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 20,
"comments" : [
{
"user" : "user1",
"message" : "My first comment",
"dateCreated" : ISODate("2013-12-09T18:35:00Z"),
"like" : 0
}
]
}
说明:
使用 find()
语句查询数据,不加任何参数默认返回所有数据记录。
pretty()
可以使查询输出的结果更美观。
查询结果排序
语法:
db.COLLECTION_NAME.find().sort({KEY: 1|-1})
升序用 1 表示,降序用 -1 表示
更新文档
基本语法:
> db.COLLECTION_NAME.update(criteria, objNew, upsert, multi)
参数说明:
criteria
:查询条件
objNew
:update 对象和一些更新操作符
upsert
:如果不存在查询的记录,是否插入 objNew 这个新的文档,true 为插入,默认为 false,不插入。
multi
:默认是 false,只更新找到的第一条记录。如果为 true,把按条件查询出来的记录全部更新。
注意:
在使用参数 multi
时,multi update only works with $ operators。也就是说,参数 multi
是和 $set
一起使用的。
> db.users.find()
{ "_id" : ObjectId("57dfaaf47c8486a21f40f526"), "name" : "tom", "email" : "tom@q
q.com" }
{ "_id" : ObjectId("57dfaaf47c8486a21f40f527"), "name" : "jack", "email" : "jack
@qq.com" }
> db.users.update({name: 'tom'}, {name: 'jerry'})
> db.users.find()
{ "_id" : ObjectId("57dfaaf47c8486a21f40f526"), "name" : "jerry" }
{ "_id" : ObjectId("57dfaaf47c8486a21f40f527"), "name" : "jack", "email" : "jack
@qq.com" }
> db.users.update({name: 'jack'}, {$set: {name: 'jerry'}})
> db.users.find()
{ "_id" : ObjectId("57dfaaf47c8486a21f40f526"), "name" : "jerry" }
{ "_id" : ObjectId("57dfaaf47c8486a21f40f527"), "name" : "jerry", "email" : "jac
k@qq.com" }
> db.users.update({name: 'jerry'}, {$set:{name: 'fuck'}}, false, true)
> db.users.find()
{ "_id" : ObjectId("57dfaaf47c8486a21f40f526"), "name" : "fuck" }
{ "_id" : ObjectId("57dfaaf47c8486a21f40f527"), "name" : "fuck", "email" : "jack
@qq.com" }
补充:
$set
用法:{$set: {field: value}}
作用:把文档中某个字段 field 的值设为 value
删除文档
基本语法:
> db.COLLECTION_NAME.remove(criteria, justOne)
参数说明:
criteria
:查询条件(可选)
justOne
:(可选)如果设置为 true 或 1,只取出一个文档
注意:
如果没有指定删除条件,则 MongoDB 将从集合中删除整个文件
> db.users.remove({})
MongoDB 中的 AND
当 find()
中传入多个键值对时,MongoDB 就会将其作为 AND 查询处理。用法:
> db.post.find(
{
key1: value1,
key2: value2
}
).pretty()
> db.post.find({"by":"tom","title": "MongoDB Overview"}).pretty()
{
"_id" : ObjectId("57dfad717c8486a21f40f529"),
"title" : "MongoDB Overview",
"description" : "MongoDB is no sql database",
"by" : "tom",
"url" : "http://www.zhihu.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
MongoDB 中的 OR
MongoDB 中,OR 查询语句以 $or
作为关键词,用法如下:
> db.post.find(
{
$or: [
{key1: value1},
{key2:value2}
]
}
).pretty()
> db.post.find({$or: [{by: "tom"}, {title: "NoSQL Database"}]}).pretty()
{
"_id" : ObjectId("57dfad717c8486a21f40f529"),
"title" : "MongoDB Overview",
"description" : "MongoDB is no sql database",
"by" : "tom",
"url" : "http://www.zhihu.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("57dfad717c8486a21f40f52a"),
"title" : "NoSQL Database",
"description" : "NoSQL database doesn't have tables",
"by" : "jack",
"url" : "http://www.zhihu.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 20,
"comments" : [
{
"user" : "user1",
"message" : "My first comment",
"dateCreated" : ISODate("2013-12-09T18:35:00Z"),
"like" : 0
}
]
}
同时使用 AND 和 OR
> db.post.find({
likes: {$gt: 20},
$or: [
{by: "tom"},
{title: "NoSQL Database"}
]
}).pretty()
条件操作符说明:
$gt
表示大于
$lt
表示小于
$lte
表示小于等于
$gte
表示大于等于
$ne
表示不等于