MongoDB 是一个基于分布式文件存储的、由 C++ 语言编写、开源的。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
连接远程:mongo xxx.xxx.xxx.xxx:27017/idedb_v1 -u localAdmin -p xxxxxxxx
MongoDB安装....
##移除原来的服务
mongod --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB" --remove
##重新注册成服务
mongod --logpath E:\GMF\Projects\Mongo_DB\data\log\mongo.log --logappend --dbpath E:\GMF\Projects\Mongo_DB\data\db --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB Server" --install
##管理员身份打开cmd,并输入命令来启动MongoDB服务
net start MongoDB
//关闭MongoDB服务 :net stop MongoDB
//移除MongoDB服务 : mongd.exe --remove
MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。
当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):
mongo
2+2
db ##显示当前数据库对象或集合,默认是链接到 test 文档(数据库)
db.runoob.insert({x:10}) ##将数字 10 插入到 runoob 集合的 x 字段中
db.runoob.find()
MongoDB与SQL术语中不同部分:
table <-> collection
row <-> document
column <-> field
表连接 <-> MongoDB不支持,但有嵌入文档
key <-> id
----关于表连接的不同方式的区别:
inner join : A和B的交集
outer join : A和B的并集
left outer join : 除了获得B表中符合条件的例外,还将获得A表的所有列
full outer join : 得到A和B的交集;即A和B中所有的行。如果A中的行在B中没有对应的部分,B的部分将是 null, 反之亦然
详见:https://blog.csdn.net/u011365831/article/details/78661440
./mongo
show dbs ##显示所有数据的列表
db ##显示当前数据库对象或集合
use local ##切换库
数据库也通过名字来标识。数据库名可以是满足以下条件的任意UTF-8字符串。
不能是空字符串("")。
不得含有' '(空格)、.、$、/、\和\0 (空字符)。
应全部小写。
最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息
BSON : Binary JSON,采用了类似于 C 语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的特点,可以有效描述非结构化数据和结构化数据。
目前主要用于MongoDB中,是mongodb的数据存储格式,基于JSON格式,进行改造 ,主要的三点目标:
更快的遍历速度;操作更简易;增加了额外的数据类型(如Date和BinData,byte array)
需要注意的是:
文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。
Capped collections 就是固定大小的collection。
在 capped collection 中,你能添加新的对象。
能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。
删除之后,你必须显式的重新创建这个 collection。
MongoDB 基本操作学习笔记:
// 查看所有数据库
show dbs
// amdin 0.000GB
// local 0.000GB
// 使用数据库
use admin
// switched to db admin
// 创建数据库:向数据库中插入记录
db.user.insert({ 'name': 'wangxi' })
// WriteResult({ "nInserted" : 1 })
// 显示当前数据库
db
// admin
// 查询当前集合中的文档
db.user.find()
// { "_id" : ObjectId("59f7f0088cc643905a25fa7f"), "name" : "wangxi" }
// 根据条件查询(and 条件查询)
db.user.find({ name: 'wangxi', age: '25' })
// 以格式化的方式来显示所有文档
db.col.find().pretty()
// 只返回一个文档
db.col.findOne()
// 跳过指定数量、返回指定数量的文档
db.user.find({}).limit(3).skip(1)
// or 条件查询
db.user.find({ $or: [{ name: 'wangxi'}, { name: 'hanjiaren'}]})
// { "_id" : ObjectId("59f821f8f4bf9a3582c6ef5c"), "name" : "wangxi" }
// { "_id" : ObjectId("59f8222df4bf9a3582c6ef5f"), "name" : "hanjiaren" }
// 条件操作符
db.user.find({ age: { $gt: 20 }}) // 大于
db.user.find({ age: { $lt: 30}}) // 小于
db.user.find({ age: { $gte: 30}}) // 大于等于
db.user.find({ age: { $lte: 30}}) // 小于等于
db.user.find({ age: { $eq: 25}}) // 等于
db.user.find({ age: { $ne: 25}}) // 不等于
// $type 操作符 —— 获取值为指定类型的文档(可以查表获取不同类型的文档对应的编号)
db.col.find({ title: { $type: 2 }})
// 删除当前数据库
db.dropDatabase()
// { "dropped" : "admin", "ok" : 1 }
// 显示当前数据库中的所有集合
show collections / show tables
// user
// 删除指定集合
db.user.drop()
// true
// 更新文档
db.user.update({ name: 'wangxi'}, { $set: { name: 'Raychan' }}, { upsert: true, multi: true })
// WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
db.train.update({"tcn":"defaultTrainCaseName"},{$set:{"tcn":"默认培训案例名称"}},{multi:true})
db.user.find()
// { "_id" : ObjectId("59f81c6f8cc643905a25fa87"), "name" : "Raychan" }
db.user.update({ name: 'wangxi'}, { $set: { name: 'Raychan' }}, true, true)
db.user.find()
// { "_id" : ObjectId("59f81c6f8cc643905a25fa87"), "name" : "Raychan" }
// { "_id" : ObjectId("59f81ef674a03e811969aa93"), "name" : "Raychan" }
// 删除文档
db.user.remove({ name: 'Raychan' }, true) // 只删除一个文档
// WriteResult({ "nRemoved" : 1 })
// 删除所有文档
db.user.remove({}) // {} 不能少
WriteResult({ "nRemoved" : 5 })
// remove 已经过时,官方推荐使用 deleteOne 和 deleteMany
db.user.deleteOne({ name: 'wangxi'})
// { "acknowledged" : true, "deletedCount" : 1 }
// 排序
db.user.find({}).sort({ age: 1})
// 聚合 $sum、$avg、$max、$min(字段引用要加 $)
db.user.aggregate([{ $group: { _id: '$name', num_of_user: { $sum: 1}}}])
// select name, count(*) from user group by name
// 管道操作
// $project: 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
db.user.aggregate({ $project: { _id: 0, name: 1, age: 0 }})
// 0 代表不输出,1 代表输出 类似于 sql 中的 select name from user
// $match: 用于过滤操作
// 筛选 age > 20 的文档
db.user.aggregate({ $match: { age: { $gt: 20 }}})
// $skip: 效果和 find().skip(num) 相同
db.user.aggregate({ $skip: 3 })
在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。
db.createCollection("runoob") # 先创建集合,类似数据库中的表
show tables(== show collections) ##格式:db.createCollection(name, options)
创建固定集合 mycol,整个集合空间大小 6142800 B, 文档最大个数为 10000 个:
db.createCollection("mycol", { capped : true, autoIndexId : true, size :
6142800, max : 10000 } )
其实,在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合:
db.collection.drop() ##删除集合
MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document) ##若插入的数据主键已经存在,则会抛xxx异常,提示主键重复,不保存当前数据。
db.COLLECTION_NAME.save(document) ##如果_id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可使用insertOne()或 replaceOne() 来代替。
insertOne()
insertMany() ##向集合插入一个多个文档
db.gmf.find() ##以非结构化的方式来显示所有文档
##也可以将数据定义为一个变量:
document=({title: 'C++ 教程',
description: 'C++ Language',
by: 'Nicholas',
url: 'http://www.cpp.com',
tags: ['Cpp', 'language', 'ggg'],
likes: 56
});
db.gmf.find().pretty() ##pretty()以易读/格式化的方式来读取数据
除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。
db.gmf.update({'title':'C++ 教程'},{$set:{'title':'CSharp'}})
##以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置multi参数为true。
db.gmf.update({'title':'C++ 教程'},{$set:{'title':'CSharp'}},{multi:true})
db.gmf.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
db.gmf.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
db.gmf.remove({title: 'MongoDB 教程'})
## WriteResult({ "nRemoved" : 2 }) # 删除了两条数据
db.gmf.find()
db.gmf.remove({title: 'MongoDB 教程'},1) ##只删除第一条找到的记录
db.gmf.remove({}) ##删除所有数据
###remove() 方法已经过时了,现在官方推荐使用 deleteOne() 和 deleteMany() 方法
db.gmf.deleteMany({}) ##删除集合下全部文档:
db.gmf.deleteMany({ status : "A" }) ##删除 status 等于 A 的全部文档:
db.gmf.deleteOne( { status: "D" } ) ##删除 status 等于 D 的一个文档:
MongoDB 与 RDBMS 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
MongoDB 的AND条件,多个key之间,使用,分隔开就是and条件
MongoDB 的OR条件,db.gmf.find({
$or: [
{key1: value1}, {key2:value2}
]
})
AND和OR联合使用: db.gmf.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty()
几个常用的特性,作用如下:
BsonId修饰的字段对应BsonDocument中的_id;
BsonDefaultValue(value)用于指定默认值;
BsonIgnore表示不映射,即使BsonDocument中包含该字段也不会赋值给属性;
BsonExtraElements修饰的字段用于存储没有映射到类中的其他属性;
BsonElement可以指定修饰的属性映射到BsonDocument中的哪个字段,序列化指定别名,还可以指定顺序order
MongoDB的特性:
BsonIgnoreExtraElements(当从DB->类映射时,忽略字段数目不相等,否则报错)
BsonId(自动产生ObjectId)、BsonElement(对应到DB的字段名)、BsonRepresentation(对应到DB中的字段类型)、、、、、、
//注:如果没有objectid的,那就是做为嵌套使用的.
参考链接:https://www.cnblogs.com/wyy1234/p/11142672.html
goto https://www.runoob.com/mongodb/mongodb-limit-skip.html
db.dropDatabase()删除当前数据库
db.createCollection("table_1")
db.table_1.drop() #删除表table_1
db.test.deleteMany({}); //删除前文test数据库中所有记录。