MongoDB系列一(索引及C#如何操作MongoDB)
索引总概况
db.test.ensureIndex({"username":1})//创建索引
db.test.ensureIndex({"username":1, "age":-1})//创建复合索引 数字1表示username键的索引按升序存储,-1表示age键的索引按照降序方式存储。
// 该索引被创建后,基于username和age的查询将会用到该索引,或者是基于username的查询也会用到该索引,但是只是基于age的查询将不会用到该复合索引。因此可以说,如果想用到复合索引,必须在查询条件中包含复合索引中的前N个索引列。然而如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB可以智能的帮助我们调整该顺序,以便使复合索引可以为查询所用。
db.test.ensureIndex({"userid":1},{"unique":true})//创建唯一索引
db.test.ensureIndex({"userid":1,"age":1},{"unique":true}) // 我们同样可以创建复合唯一索引,即保证复合键值唯一即可
db.test.ensureIndex({"username":1},{"background":true})//如果在为已有数据的文档创建索引时,可以执行下面的命令,以使MongoDB在后台创建索引,这样的创建时就不会阻塞其他操作。但是相比而言,以阻塞方式创建索引,会使整个创建过程效率更高,但是在创建时MongoDB将无法接收其他的操作。
db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true})
//创建唯一索引,并消除重复数据。
db.test.getIndexes()//查看索引
db.system.indexes.find()// system.indexes集合中包含了每个索引的详细信息,因此可以通过下面的命令查询已经存在的索引
db.test.dropIndex({"username":1})//删除索引
Explain方法简介
explain是非常有用的工具,会帮助你获得查询方面诸多有用的信息。只要对游标调用该方法,就可以得到查询细节。explain会返回一个文档,而不是游标本身。explain会返回查询使用的索引情况,耗时和扫描文档数的统计信息。
db.test.find().explain()
{
"cursor" : "BasicCursor",
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : { }
}
- "cursor":"BasicCursor"表示没有使用索引,查找采用的是“表扫描”,也就是顺序查找。 ”BtreeCursor"采用B树的结构来存放索引
- "nscanned":1 表示查询了多少个文档。
- "n":1 表示返回的文档数量。
- "millis":0 表示整个查询的耗时。
这里特别说明一下哦,不要认为你把里面的数据都删除掉了索引也随之没有了,索引自从你建立之后就一直存在在那儿,除非你手工删除,如果你确定是不需要的索引,请务必使用dropIndex方法将它手工删除。
C#中使用MongoDB DLL驱动
MongoDB.Driver.dll:顾名思义,驱动程序
MongoDB.Bson.dll:序列化、Json相关
下载地址 http://files.cnblogs.com/files/liyunhua/MongoDBDll.zip
c#操作MongoDB简单代码介绍
模型层代码如下:
/// <summary>
/// 用户主要资料
/// </summary>
public class UserInfo
{
public string UserId { get; set; }
public string UserName { get; set; }
public string PassWord { get; set; }
public Detail Detail { get; set; }
} /// <summary>
/// 用户详细资料
/// </summary>
public class Detail
{
public string Address { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
UserBLL逻辑层中主要代码如下:
public string connectionString = "mongodb://localhost";//连接字符串
public string databaseName = "myDatabase";//数据库名 private Mongo mongo;
private MongoDatabase mongoDatabase; //注意这里泛型类型为“UserInfo”
private MongoCollection<UserInfo> mongoCollection; public UserBLL()
{
mongo = GetMongo();
mongoDatabase = mongo.GetDatabase(databaseName) as MongoDatabase;//获得数据库
mongoCollection = mongoDatabase.GetCollection<UserInfo>() as MongoCollection<UserInfo>;//获得数据库中集合
mongo.Connect();//在构造函数中进行数据库连接
}
~UserBLL()
{
mongo.Disconnect();//在析构函数中进行关闭连接
} /// <summary>
/// 配置Mongo,将类UserInfo映射到集合
/// </summary>
private Mongo GetMongo()
{
var config = new MongoConfigurationBuilder();
//进行映射
config.Mapping(mapping =>
{
mapping.DefaultProfile(profile =>
{
profile.SubClassesAre(t => t.IsSubclassOf(typeof(UserInfo)));
});
mapping.Map<UserInfo>();
});
config.ConnectionString(connectionString);
return new Mongo(config.BuildConfiguration());
}
插入、选择、删除数据方法如下(写在UserBLL中)
/// <summary>
/// 查询详细资料地址为湖北的用户信息
/// </summary>
public List<UserInfo> Select()
{
return mongoCollection.Linq().Where(x => x.Detail.Address == "湖北").ToList();
} /// <summary>
/// 删除全部用户信息
/// </summary>
public void DeleteAll()
{
mongoCollection.Remove(x => true);
}
/// <summary>
/// 插入一些数据
/// </summary>
public void InsertSomeData()
{
UserInfo userInfo1 = new UserInfo()
{
UserId = "",
UserName = "张三",
PassWord = ""
};
mongoCollection.Save(userInfo1); UserInfo userInfo2 = new UserInfo()
{
UserId = "",
UserName = "李四",
PassWord = "",
Detail = new Detail()
{
Address = "湖北",
Age = ,
Email = "lisi@163.com"
}
};
mongoCollection.Save(userInfo2); UserInfo userInfo3 = new UserInfo()
{
UserId = "",
UserName = "王五",
PassWord = "",
Detail = new Detail()
{
Address = "广东",
Age = ,
Email = "wangwu@163.com"
}
};
mongoCollection.Save(userInfo3); UserInfo userInfo4 = new UserInfo()
{
UserId = "",
UserName = "赵六",
PassWord = "",
Detail = new Detail()
{
Address = "湖北"
}
};
mongoCollection.Save(userInfo4); }
当然上述的查询和删除的方法写成如下所示也是可以的
/// <summary>
/// 删除全部用户信息
/// </summary>
public void DeleteAll()
{
mongoCollection.Remove(new Document { });
}
/// <summary>
/// 插入一些数据
/// </summary>
public void InsertSomeData()
{
Document userInfo1 = new Document();
userInfo1["UserId"] = "";
userInfo1["UserName"] = "张三";
userInfo1["PassWord"] = "";
mongoCollection.Save(userInfo1); Document userInfo2 = new Document();
userInfo2["UserId"] = "";
userInfo2["UserName"] = "李四";
userInfo2["PassWord"] = "";
//子文档
var userInfo2Detail = new Document();
userInfo2Detail["Address"] = "湖北";
userInfo2Detail["Age"] = ;
userInfo2Detail["Email"] = "lisi@163.com";
userInfo2["Detail"] = userInfo2Detail;
mongoCollection.Save(userInfo2); Document userInfo3 = new Document();
userInfo3["UserId"] = "";
userInfo3["UserName"] = "王五";
userInfo3["PassWord"] = "";
var userInfo3Detail = new Document();
userInfo3Detail["Address"] = "广东";
userInfo3Detail["Age"] = ;
userInfo3Detail["Email"] = "wangwu@163.com";
userInfo3["Detail"] = userInfo3Detail;
mongoCollection.Save(userInfo3); Document userInfo4 = new Document();
userInfo4["UserId"] = "";
userInfo4["UserName"] = "赵六";
userInfo4["PassWord"] = "";
var userInfo4Detail = new Document();
userInfo4Detail["Address"] = "湖北";
userInfo4["Detail"] = userInfo4Detail;
mongoCollection.Save(userInfo4); }
在控制台main函数中的代码如下所示:
UserBLL userBll = new UserBLL();
userBll.InsertSomeData();
var users = userBll.Select();
foreach (var user in users)
{
Console.WriteLine(user.UserName + "是湖北人");
};
userBll.DeleteAll();
Console.ReadKey();
运行的效果如图所示:

附加话外问题
今天同学问我一个问题,在我看来我觉得太简单不过了,都懒得理会他,结果拿到手上来一试居然没解决。不知道有谁看到我这篇文章的高手能给我一点建议!
言归正传,我同学需要限制文本框只能输入中文,测试代码如下所示:
<input type="text" onchange="value = value.replace(/[^\u4E00-\u9FA5]/g, '') " />
结果就是在所有浏览器里面都可以,唯独谷歌不行,在谷歌中运行的效果就是只能输入第一次中文,后面的中文就全部输入不进去了,搞了老半天,在群里面也问过好些高手,都没有给我一个最终方案。
最后我只能经一位高手的指引建议我同学采用http://www.mathachew.com/sandbox/jquery-autotab/
但是后来我同学觉得如果采用插件的方式的话,第一不知道是否可行,第二改动太大。我后来也忙,最后不了了之了。
不知道在座的各位是否能够帮忙解决一下。(心里这个好奇呀)
MongoDB系列一(索引及C#如何操作MongoDB)的更多相关文章
- MongoDB(索引及C#如何操作MongoDB)(转载)
MongoDB(索引及C如何操作MongoDB) 索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureInd ...
- MongoDB 系列(二) C# 内嵌元素操作 聚合使用
"_id" : "639d8a50-7864-458f-9a7d-b72647a3d226","ParentGuid" : "00 ...
- 4.MongoDB系列之索引(一)
1. 执行计划查看 db.getCollection('users').find({'username': 'shenjian'}).explain('executionStats') 结果查看,先大 ...
- 5.MongoDB系列之索引(二)
1. $运算符如何使用索引 1.1 低效的运算符 $ne.$not查询可以使用索引,但不是很有效,尽量避免 1.2 范围查询 范围查询其实是多值查询,根据复核索引规则,尽可能先等值精确匹配,然后范围查 ...
- MongoDB 学习笔记(四)C# 操作MongoDB
C#驱动对mongodb的操作,目前驱动有两种:官方驱动和samus驱动,不过我个人还是喜欢后者, 因为提供了丰富的linq操作,相当方便. 官方驱动:https://github.com/mongo ...
- MongoDB入门(8)- c#通过操作MongoDB GridFS实现文件的数据库存储
GridFS介绍 GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件. GridFS GridFS长啥样 /* 1 */ { "_id" : ObjectId(& ...
- php操作mongodb的常用函数
连接mongodb: $mongoObj = new Mongo("127.0.0.1" , array( 'connect'=>true, 'persist'=>tr ...
- MongoDB 系列文章
MongoDB 系列文章 本文的内容是基于 MongoDB 4.0 的. 参考于 MongoDB 4.0 官方文档. 搭建 MongoDB从搭建到优化 MongoDB-副本集搭建与管理 管理 Mong ...
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...
随机推荐
- Javascript的精华啊【如果以后我看到了或者想到了再继续补吧】
我不过略有一些讨人喜欢的地方而已,怎么会有什么迷人的魔力呢? 一.语法 JS只有一个数字类型,64位浮点数,所以1和1.0是相同的.为什么这么设计:防止短整型的溢出. 二.对象 1.通常将一个对象的值 ...
- Node基础:url查询参数解析之querystring
模块概述 在nodejs中,提供了querystring这个模块,用来做url查询参数的解析,使用非常简单. 模块总共有四个方法,绝大部分时,我们只会用到 .parse(). .stringify() ...
- Bootstrap系列 -- 7. 列表排版方式
一. 去点列表 1. 使用class=list-unstyled <ul > <li>无序列表项目</li> <li>无序列表项目</li> ...
- Codeforces Round #369(div 2)
A:=w= B:=w= C:题意:有一排树,有的树已经上色,有的树没有上色,只能给没上色的树上色,一共m种颜色,不同的树上不同的色花费不同,涂完色后,连续颜色的树成为一段.对于给定的段数k,求出最小花 ...
- 查询和修改(Queries and Mutations)
On this page, you'll learn in detail about how to query a GraphQL server. 在这个页面,你将会学习更多的关于如何查询GraphQ ...
- GO语言数组和切片实例详解
本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...
- 《Javascript DOM编程艺术》 读书笔记 —— 好书,通俗易懂!!!!! 相当的严谨!!!!
1.javascript弱类型语言,解释性语言. 2.javascript数据类型:字符串(String).数字(Number).布尔(Boolean).数组(Array).对象(Object).空( ...
- 【POJ 1151】Atlantis
离散化后扫描线扫一遍. 夏令营时gty学长就讲过扫描线,可惜当时too naive,知道现在才写出模板题. 当时也不会线段树啊233 #include<cstdio> #include&l ...
- 【BZOJ 3050】【USACO2013 Jan】Seating 线段树
线段树维护4个标记, 昨天互测时题意理解错了,今天上午才发现. #include<cstdio> #include<cstring> #include<algorithm ...
- python 中的sort 和java中的Collections.sort()函数的使用
x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...