@HtmlPagesHelper.ShowPageNaigate(this.Html,(int)ViewData["pageIndex"],(int)ViewData["pageSize"],(int)ViewData["total"])
@Html.TextAreaFor(model => model.PostContent, new { @class="ckeditor"})
<script src="~/Scripts/ckeditor/ckeditor.js"></script>
<script src="~/Scripts/ckeditor/config.js"></script>
ActionFilter,在执行C#前
ResultFilter ,在执行C#后
第三种FilterConfig
异常过滤器
继承微软的默认过滤器:HandleErrorAttribute,只要重写这个方法即可。
1,把错误信息写入到日志文件里面。同时出现多个错误时,只有写个队列让异常存在队列中等等等处理。
写个LogHelper
Log4Net原理 就是使用观察者模式:猎人开一枪(触发者),猪伤了,鸟飞了,狗去追了。等日志就是程序的黑匣子
怎么的业务需要,可以应用观察者模式呢?
日志记录:写入不同地方,另外同时可能写到多个地方
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
<param name="Header" value=" -------------------------Header-------------------------" />
<param name="Footer" value=" -------------------------Footer-------------------------" />
通知消息:
消息系统Msmq
日志 的作用,将运行过程 的步骤,成功失败记录下来,将关键性的数据记录下来分析系统问题所在。
这个信息是给开发人员看来,来处理异常记录,也就是修改bug
配置Log4Net环境
新建一个控制台项目,添加一个应用程序文件(App.config)
在App.Config或者Web.Config的添加配置
添加对Log4Net.dll的引用
初始化:在程序最开始加入log4Net.Config.XmlConfigurator.Configure();
在要打印日志的地方LogManager.GetLogger(typeof(Program)).Debug("信息");
通过LogManager.GetLogger传递要记录的日志类类名获得这个类的ILog(这样在日志 文件中就能看到这条日志是哪个类输出了),然后调用Debug
方法输出消息。因为一个内部不止一个地方 要打印日志,所以一般把ILog声明为一个Static字段;
输出错误信息用ILog.Error方法,第二个参数可以传递Exception对象,log.Error(“错误”+ex),log.Error("错误Message",ex)
<appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="App_Data/" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<!--根据日期回滚-->
<param name="DatePattern" value=""Logs_"yyyyMMdd".txt"" />
<param name="StaticLogFileName" value="false" />
<!--每天记录日志按日期-->
<layout type="log4net.Layout.PatternLayout,log4net">
<!--日志级别None>Fatal>Error>Warn>Debug>info>all设定一个Level,那么低于这个级别就不记录日志了-->
<param name="Header" value="[Header]" />
<param name="Footer" value="[Footer]" />
<param name="ConversionPattern" value="%d [%t] %-5p %c[%x] - %m%n" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" />
<param name="LevelMin" value="WARN" />
</filter>
</appender>
<appender name="ConsoleApp" type="log4net.Appender.ConsoleAppender,log4net">
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
</layout>
</appender>
Memcache,redis分布式的日志系统,解决不同服务器上的日志记录在同一个文件中
权限登录
表单同步提交
异步提交:
1 微软自带@using(Html.BeginForm("index","home",FormMethod.Post) ){}
等价于将在客户端产生一个类似<form action="/account/login"
method="post"></form>标签
2 Ajax @using(Ajax.BeginForm() ){}
参考资料https://www.cnblogs.com/sheng-jie/p/6305385.html
处理登录表单:
1 处理验证码
从前台拿数据string strCode=Reques["vCode"];
string sessionCode=Session["VCode"] as string;
Session["VCode"]=null;
Session 有个小bug其实是他的特点:就是不管验证码是否正确,Session中的值仍然是上次存的值,所以在使用一次后,不要把Session对就的值清
空。
if(string.IsNullOrEmpt(sessionCode)||strCode!=sessionCode)
{
return Content("验证码错误。");
}
2处理验证码用户名及密钥
在lambda表达式中或Linq中不能进行类型转换,要在使用前就要做好转换
short delNormal=(short)ELEC.OA.Model.Enum.DelFlagEnum.Normal
@HtmlPagesHelper.ShowPageNaigate(this.Html, (int)ViewData["pageIndex"], (int)ViewData["pageSize"], (int)ViewData["total"])
@Html.Raw(Model.UserContent)//把HTML标签正常显示
全局验证的问题,
1)可以放在全局过滤器
2)新建一个控制器基类来通过子页面继承关系选择校验,用此方法还可以抽象控制器公用的方法
当前页面可以通过filterContext.RouteData.Values;取到请求的地址
互联网项目,优化Session
Session的机制 就是在Cookie中放一个SessionId
1,去掉Session原因:性能,不稳定输出(主要是IIS经常重启),进程外Session数据据性能也比较差。
组成集群时,登录数据要进行共享(类似单点登录),利用有公共缓存来处理。
通过公共组件来达到数据共享。公共组件:分布式缓存系统Memcache
单机Session无法共享。之前是使用进程外Session,但是性能也不太好。所以用公共组件:分布式缓存系统Memcache来实现。Cache放的就是Key
Value值。
集群:一个域名对应一个IP,但是多个服务器 集群IP地址是虚拟的
一个请求,会分发到群集中的所有机器,但是只有一台机器处理。
1,LVS集群,请求分发,如果调试需要自己写代码。(内核)
2,Windows server :NLB Network load balancing (网络负载均衡)
一个集群最多支持20台机器,如果处理请求的服务器故障,仍会回发请求,重新分发
3,F5 电信设备。价格30万 淘宝的机房硬件集群
路由器必须设置静态IP,
2 JSON
软件架构从单机到分布式
高并发访问数据库的痛楚:死锁 0.3% select * from UserInfo with(nolock)死锁情况下查询可能会查询出来脏数据,读写分离,数据库集群(
SqlServer中间件,发布订阅功能,备份 主从数据库延迟10S左右)
2,代码实现多个库进行操作。性能比较差。(互联网项目不会用这个数据库)
3,Mysql,本身支持的不错,很多开源的成功案例,一般互联网项目用。
Why Use Memcached?
磁盘IO之痛:本机,ASPNET:HttpRuntime.Cache
多客户端共享缓存
Net(局域网)+Memory(内存)>>(远大于)IO(磁盘)
读写性能完美Redis:Mm, 1s:读取可以1w次,写10W
超简单集群搭建Cluster
Memcache 就是一列
原理:把内存分块。不同的块中,大小不同,但是在同一块中所有片大小一样(最大1M)。根据用户的value值来寻找甜酸内存块大小来申请内存
存储。内存分片是为了尽量避免内存碎片的问题。
申请内存,如:new List,new Arrary
Socket服务器端端
数据:键值对存储
内存处理的算法:
本质就是一个大的哈希表,Key最大长度是255个字符
内存模型:Memcahe预先将可支配的内存空间进行分区Slab,每个分区里面再分多个块最大1M,每个区中的块的长度bytes都是固定的。这个是为了
尽量避免内存碎片的问题
插入数据:查找适合自己长度的块,然后插入。会有内存浪费 。
LRU,闲置>过期>最少访问
惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个Key数据时,如果过期那么就直接抛弃。
集群搭建原理,
Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。
客户端实现集群原理:首先客户端配置多台集群机器的ip和端口的列表,然后客户端驱动程序在写之前,首先对Key做哈希处理得到哈希值后对总的
机器个数进行取余,然后就选择余数对应的机器。
key 最大250个字符,item最大1M当然key/value是好别大,过期30天
Memcache服务器配置安装方法
http://blog.csdn.net/l1028386804/article/details/61417166
cmd命令行下按首字母,再按Tab键会自动补全文件名。
启用Telnet服务器端和Telnet客户端 在程序和功能--启用或关闭Windows功能--Telnet客户端(这里就会有telnet命令了)
连接Memcached服务器的默认端口11211
telnet 192.168.0.52 11211
stats(不显示回车)会有列表
add key1 0 0 5 这是保存成功一条数据
get key1
数据库优化:
1,水平分为库:
1.1新建数据库时,有个文件组,把数据库文件用这个文件组可以分布在不同磁盘上,充分利用磁盘的IO,这叫水平分为库
1.2,表分区。当表大时,表数据就可以用SQL脚本来完成
按照日期分区
按照某一条件来分区,存在不同磁盘上
1.3,表主动分区:加索引可以提高查询速度,但是更新频繁时,尤其遇到删除时,系统会重建索引,之时会耗尽系统性能,
这时跨区查询性能会比更加慢
索引只加在查询比较频繁的
历史数据放到历史表
当前表只放最近三天的数据。
如何导入最新的数据到历史数据表。这时可以写个脚本在业务低时,把最新数据自动导入历史数据表中
可以利用代理服务,来执行相应的维护计划。
DBA来操作这种维护计划
2,垂直分库
2.1 把数据库分成多个数据库,根据业务模块分的:如
用户相关的数据都放到用户数据库上
订单相关的数据放到订单数据库上
多台服务提供服务,压力分流。跨库性能
3,数据库集群:读写分离,一个主库,多个从库
多主库,多从库
4
不足,就是同步延迟问题
4,最好的就是用缓存解决磁盘的IO性能(7200R/分)问题,使用分布式缓存(内存)服务系统Memached redis
新浪微博,第一步先用Redis来存储,最后还是用Mysql存储在磁盘来,来保证数据完整性与持久化
自己利用时,把经常使用的数据放在Redis放在内存中,不经常用的放在磁盘中
技术发展
第一是面向接口对象webAPI
第二是面向服务WCF:
第三是面向资源Restfull,http协议方法去对后台服务进行一个操作,put get delete
程序--C#驱动(Socket客户端)--Memcached的Socket服务端
定义一个协议和mm自己协议
另外一个绕开驱动程序,直接用telnet客户端直接连接MM的telnet服务端即可通信
DDD_NLayered_Net_Architecture_Guide_with_.Net4.0
RoRoWoBolg
https://www.cnblogs.com/taven/archive/2010/10/10/1847057.html
set key 重新设置
也可以用Replace替换
Memcached之.Net实例http://blog.csdn.net/zyh_1988/article/details/52453305
Memcache集群原理:它是通过客户端驱动来实现集群。而Redis/MongoDb通过服务器端实现集群。
1,把服务器进行初始化。驱动程序中做了两个哈希。对Key根据哈希值对服务器个数(2)取余数。根据结果来把值 放到受益人服务器上存储起来
2,get时对key做hash取余数到指定服务器上取余数
缓存只是冗余的数据。主要是解决磁盘IO的数据。当缓存丢失后,最后还是读取磁盘,然后再放到缓存中
淘宝大网站,利用一致性哈希算法,来解决Memcache服务器扩容时,导致数据丢失的问题降到最低。
https://www.cnblogs.com/daizhj/archive/2010/08/24/1807324.html一致性Hash算法(KetamaHash)的c#实现
MM优点及不足
不能作为持久化保存
存储数据有限制,1M
mm只能存储Key-Value
集群数据没有同步机制
内存回收不及时,主要是考虑到系统开销问题
缓存存的是Key值
换成Memcache验证时,要在Model模板中添加[Serializable]序列化,这样有利用分布式传输。Socket通信是要序列化的
使用memcache解决单点登录
NoSQL简介,这是篇博文
https://www.cnblogs.com/zhoujie/archive/2013/05/19/redis1.html
为什么需要NoSQL非关系型数据库?
对数据为库高并发读写的需求
对海量数据的高效率存储和访问的需求
对数据库的高可扩展和高可用性的需求
关系型死锁一般用临时表来解决
SQLServer可以保证数据库的完整性,一致性,它具有事务性的服务
一般是NoSQL和SQL server共存的
Redis解决Memcache断电完全丢失的问题。它一般放在内存和磁盘中 set110000次,get 操作81000次
高性能,持久存储,适应高并发的应用场景。和Memcache类似。它支持存储的Value类型相对更多,包括字符
Redis放在一个英文目录中
守护进程 后台运行 redis-server.exe /config/redis.conf
端口默认是6379
redis-cli.exe -h 192.168.0.52 -p 6379 连接数据库
set dd ss 添加服务
MM和Redis不同点:
一、集群方式不同
Mm通过客户端驱动实现集群化
redis通过服务器配置实现集群化:通过快照过Socket发送到从库中执行
二、Redis可以作数据持久化,通过从库来恢复,另外通过日志来恢复不同步的数据达到完美
三、Redis提供了高级的数据结构
四、Redis是单线程,处理数据比较小时几KB时,和MM效率很相近。超过1M后MM比较有优势。MM是多线程。
单线程,就是只启用一个线程写入到内存
多线程,就是启动多个线程同时写入到内存中
一台机器同一时间接受客户端的连接数据连接请求是有限的。一般为1000个连接(根据CPU及硬件配置线程总数)。其它连接必须在队列中等待处
理,每个CPU可以处理255个请求。请求时必须过程Socket,网络带宽肯定是有限的。每个线程至少要占用1M内存。线程多时也需要调度,调度时也
是要耗用内存的。
所以要多台机器来处理。
bing 127.0.0.1
slaveof 127.0.0.1 6379
port 6381
将鼠标指针移至要选择的文本左侧,按住〔Alt〕键不放,同时按下鼠标左键,拖曳鼠标选择需要的文本,释放〔Alt〕键即可选择垂直文本
今天运行Redis时发生错误,错误信息如下:
(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may
modify the data set are disabled. Please check Redis logs for details about the error.
Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。
原因:
强制关闭Redis快照导致不能持久化。
解决方案:
运行config set stop-writes-on-bgsave-error no 命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。
root@ubuntu:/usr/local/redis/bin# ./redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
OK
127.0.0.1:6379> lpush myColour "red"
数据库操作的请求量非常大
把多个sql合成一个sql的执行,减少解析编译的过程,提供吞吐率。
正好队列是有顺序的,可以把更新的脚本,放在队列中,一次执行。
Redis 主从自动failover
ligerUI,作者谢略
位置做记录到数据库,拖拽
//Todo:信息
可以从任务列表中查看
jQuery zTree插件
数据的异步请求数据,返回成功的数据指给数据列表即可
应用程序权限设计
https://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permission.html
UserActionChannel表:这个用户在这个页面拥有这个动作的权限
UserActionContent表:这个用户在对这个数据是否有这个动作的权限
对象序列化后 再传json --redis ---json --对象反序列化。这样就可以把关系型数据库转化为Key-Value思想
mongodb:对查询相对比较好,它是文档型数据库,支持Linq。
新建实体模型时,如果加了实体关联,可以不加对应关联字段。
如果实体间关联,那么就要自己加一个关联表的KEY字段到表中
标量属性,相同字段,可以先选中,再复制粘贴即可
IsMenu 是否加载菜单
有导航属性时,使用微软默认序列方式,会有问题。进入列循环,使用Select要序列化常用的字段,即可
日期插件 datapattern.js
MVC:来了一个请求,根据请求地址,来创建控制器工厂,控制器工厂来创建控制器,执行方法
Spring.NET 来了一个请求,根据请求地址,来创建Spring容器,Spring容器来创建控制器,执行方法
//批量删除,真删除
public bool Delete(int id)
{
var entity=Db.Set<T>().Find(Id);
Db.Set<T>().Remove(entity);//查询出来可以直接Remove
return true;
}
//批量删除,软删除
public int DeletListByLogical(List<int> ids)
{
foreach(var id in ids)
{
var entity=Db.Set<T>().Find(id);
Db.Entry(entity).Property("DelFlag").CurrentValue=1;//也可以从自定义的枚举类型中调用
Db.Entry(entity).Property("DelFlag").IsModified=ture;//先标记修改状态
}
return ids.Count;
}
引入分页方法
后台代码
public ActionResult Index(int pageIndex=1,int pageSize=10)
{
//throw new Exception("test");
//base.LoginUser.UserName;
//ViewData.Model = userInfoService.GetEntities(u=>true);
ViewData["pageIndex"] = pageIndex;
ViewData["pageSize"] = pageSize;
int total=0;
ViewData.Model = userInfoService.GetPageEntities(pageSize, pageIndex, out total,u=>true,u=>u.UserId,true);
ViewData["total"] = total;
return View();
}
前台代码
@HtmlPagesHelper.ShowPageNaigate(this.Html, (int)ViewData["pageIndex"], (int)ViewData["pageSize"], (int)ViewData["total"])
使用ckedit
前台先引用ckeditor的相关脚本
@Scripts.Render("~/Scripts/ckeditor/ckeditor.js")
@Scripts.Render("~/Scripts/ckeditor/config.js")
在需要编辑的位置插入样式,并设置THtml.TextAreaFor
@*@Html.EditorFor(model => model.UserContent, new { htmlAttributes = new { @class = "form-control" } })*@
@Html.TextAreaFor(model => model.UserContent, new { @class = "ckeditor" })
利用
展示时要用@Html.Raw,否则会连HTML标签也展示出来
@*@Html.DisplayFor(modelItem => item.UserContent)*@
@Html.Raw(item.UserContent)
子容器,调用父容器的方法
window.parent.window.afterEditSuccess();
Visual Studio2015如何停止调试,却不停止IIS
在VS主面板打开:工具->选项->调试->编辑继续 取消选中[启用"编辑并继续"] 就可以(不过这是针对所有的调试)。
若只想对单个项目进行设置,可以选择自己的项目,通过属性里的web设置来关闭,如下图
选择web项目,右键选择【属性】--【web】--【调试器】,把[启用编辑并继续]项去掉选择就可以了
上传图片MVC后台代码
public ActionResult UploadImage()
{
var file=Request.Files["fileMenuIcon"];
string path="/UploadFils/UploadImgs/"+Guid.NewGuid().ToString()+"-"file.FileName;
file.SaveAs(Request.MapPath(path));
return Content(path);
}
HTML布局
放一个隐藏域用于存放URL
放一个type="file"用户选择图片文件(最好加过滤文件类型)
放一个Button来让用户确认上传按钮
下面放<div id="uploadImg">用来显示图片
使用Ajax做成异步上传,用户点击后选择的图片地址入到指定文件夹下,并把地址传回前台隐藏域中,另外显示到前台Div中
前台JS
$.("#btnUploadFile").click(function(){
$(#addDialogDiv form).ajaxSubmit({
url:"/ActionInfo/UploadImage",
type:"post",
success:function(data){
//把返回的URL地址放到页面的隐藏域中
$("#MenuIcon").val(data);
$("#uploadImg").html("<img src='"+data+"' style='width:100px;height:100px;'");
}
});
});
海量文件存储问题
1,高扩展性:比如服务器满了,很容易加后备服务器
2,易用性:使用简单
3,高可靠性:旧服务器有问题,很容易匹配后备服务器,后续不存储此服务器,只能提供图片下载服务
4,灵活性,易维护,成本低。
解决思路:
1,提供服务有两个WebService
提供存储文件服务:请求文件存储,返回一个服务生成的GUID KEY,服务对应一个文件服务器集群。存储时要分发均匀集群中的每一台
数据库:文件服务器状态表(id,serverIp,Path,State,)如:1 192.168.0.100 D:\files\ 良好
id,serverIp,Path,State
1 192.168.0.100 D:\files\ 良好
2 192.168.0.101 E:\files\ 已满
3 192.168.0.102 f:\files\ 良好
服务读取文件服务器状态表,把所有运行良好的服务器查询出来,然后随机选择一台服务器,然后将此文件写入到此服务器上
文件信息表
ID(GUID) serverID FileName FileSize FileType
46safddfdddfs 3 a 100KB .txt
获取文件的服务:get key
跨服务器操作文件的问题
Webservice 去访问一个服务器上的文件
文件操作:File.ReadAll..(共享文件夹路径)让所有服务器放在一个域名中,这样可以用域控控制权限访问
第二种,利用FTP
跨进程操作文件。在每个服务器上配置一个客户端
Socket:TCP
压力分流,服务也可以做群集。
成本只有服务器,和数据库,程序软件
ViewBag和viewData一样都 可以向前台传值。
但是ViewBag是动态赋值的。
ViewBag.AllRoles=RoleInfoService.Get();
viewBage.AllRles.toList();
前台单选按钮加上删除键显示
<div class="radioDiv">
yes<input type="radio" name="@strId" value=1 uId="@user.ID" actionId="@actionInfo.ID" />
no<input type="radio" name="@strId" value=0 uId="@user.ID" actionId="@actionInfo.ID"/>
<input type="button" class="btnDel" value="删除" id="btnDelete" uId="@user.ID" actionId="@actionInfo.ID" />
<div>
前台JS代码
<script type="text/javascript">
$(function(){
$(":radio").click(function(){
//发送异步请求,先拿到uid actioid
var uId=$(this).attr("uId");
var actionId=$(this).attr("actionId");
var value=$(this).val();
$.post("/UserInfo/SetUserAction",{UId:uId,ActionId:actionId,Value:value});
});
//前台删除
$(".btnDel").click(function)(){
//发送前先判断,有选中时才会向后台做异步请求
if($(this).siblings(":radio").length>0){
//后台删除需要通过Ajax异步请求删除
$.post("/UserInfo/DeleteUserAction",{UId:$(this).attr("uId"),ActionId:$(this).attr("actionId"),
function(data){}
});//function可有可无如果没有提示
}
$(this).siblings(":radio").attr("checked",false);
});
});
UserInfo后台代码
public ActionResult DeleteUserAction(int UId,int ActionId)
{
var rUserAction=R_UserInfo_ActionInfoBll.GetEntities(r=>r.ActionInfoID==ActionId$$r.UserInfoID==UId).FirstOrDefault();
if(rUserAction!=null)
{
//rUserAction.DelFlag=(short)Model.DelFlagEnum.Deleted;
R_UserInfo_ActionInfoBll.DeleteListByLogical(new List<int>() {rUserAction.ID});
}
return Content("Ok");
}
public ActionResult SetUserAction(int UId,int ActionId,int Value)
{
var rUserAction=R_UserInfo_ActionInfoBll.GetEntities
(r=>r.ActionInfoID==ActionId&&r.UserInfoID==UId&&r.DelFlag=delflagNormal).FirstOrDefault();
if(rUserAction!=null)
{
rUserAction.HasPermission=Value==1?true:false;
R_UserInfo_ActionInfoBll.Update(rUserAction);
}
else
{
R_UserInfo_ActionInfo r_UserInfoActionInfo=new R_UserInfo_ActionInfo();
r_UserInfoActionInfo.ActionInfoID=ActionId;
r_UserInfoActionInfo.UserInfoID=UId;
r_UserInfoActionInfo.HasPermission=Value==1?true:false;
r_UserInfoActionInfo.DelFlag=delflagNormal;
R_UserInfo_ActionInfoBll.Add(r_UserInfoActionInfo);
}
return Content("Ok");
}
缓存中的实体不能被上下文所跟踪,所以无法直接取到当前实体的导航属性,只有重新得到实体(重新查询下)才能被上下文所跟踪,才能得到实
体的导航属性
数组去重复数据操作代码:
allActionIds=allActionIds.Distinct().ToList();
把最后一个标志符号去掉代码:
string str=sb.ToString().TrimEnd(',');
通过Spring.net来注入时,如果基类想使用子类实体,就需要直接通过容器来创建一个对象。
IApplicationContext ctx=ContextRegistry.GetContext();
IActionInfoService actionInfoService=ctx.GetObject("ActionInfoService") as IActionInfoService
如果子类想使用某个实体,或实体中的属性,直接通过spring.net来注入即可。
1,要在使用页面Controller中定义一个实体属性 ActionInfo
注销就是移除用户的cookie,然后跳转登录页面即可
八种NoSQL数据库系统对比
http://blog.jobbole.com/1344/
MongoDB特点
默认端口:27017
模式自由的文档结构数据库:多一列少一列没有严格要求
面向集合存储,易维护
支持动态查询
支持完全 索引 包含内部对象、
支持查询
自动处理碎片
他所说的文档集合就相当于关系数据库SQL中的表;一个文档(Json字符串),相当于sql中表中的一行数据。
关闭MongoDB服务,然后要卸载MongDB服务
cd MongoDB 定位到这里,输入以下命令即可卸载此服务
mongod.exe --remove
启动MongoDB服务,但是控制台关闭会断开
mongod.exe --dbpath f:/MongoDB/Data
退出就是Ctrl+C
查看帮助mongod.exe --help
安装服务后要启动服务,如果加上 --quiet日志比较少
安装服务:
mongod.exe --dbpath f:/MongoDB/Data --install --logpath a.log
启动服务:
net start MongoDB
此时就完成安装任务,即可连接。
mongo.exe是用来连接
mongo.exe --help可以打开帮助
mongo.exe --host 127.0.0.1 --port 27017
可以支持Javascript脚本 变量运算
cls清屏
切换数据库,直接用
use demo
查看所有数据库
show dbs
查看当前数据库所有集合
show coolections
db
就是当前数据库
查询当前数据库的所有数据
db.User.find()
向集合中插入一条数据
db.User.Insert({ 回车
"UId":4,
"SName":"demo",
"TestColumn":"123"
})回车
删除数据
db.User.remove()
db.User.find()
查询数据UID=5
var item = db.Users.find({"UId":5})
查询UID=5数据
item
修改字段
item.SName="22222"
保存修改
db.Users.update(
{"UID":5},
{"UID":5,SName="22222","TestColumn":"1423"})
条件过滤删除
db.Users.remove("UId":{"$gt":8})//$gt是大于号
db.Users.find("UId":{"$gt":8})
多条件怎么做 如and or等
db.Users.remove("UId":{"$gt":8},"SName":"22")
db.Users.find("$or",[{"UId":{"$gt":8}},{"SName":"22"}])
MongoDB学习笔记
https://www.jianshu.com/p/4e4712a25861
一台机器有多个IP地址。集群会有