MongoDB

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数据库中所有记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值