博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[教程]MongoDB 从入门到进阶 (概要 以及 高级索引篇 TimeToLive GeoNear)
阅读量:5018 次
发布时间:2019-06-12

本文共 6665 字,大约阅读时间需要 22 分钟。

MongoDB概要

[关于MongoDB]

    官方网站: www.mongodb.com

    MongoDB属于比较典型的NoSql数据库。和Relationship数据库相比,其数据属于文档结构。

    最新版本的MongoDB为2.2.2   不支持WindowsXP

[C#官方驱动程序]

     GitHub:https://github.com/mongodb/mongo-csharp-driver

[管理工具]

     这里选用本人自制的可视化管理工具作为教程的演示工具。

     大声呼吁:有兴趣的同志,加入这个工具的开发

     下载地址:

     GitHub:  

[建立第一个空数据库]

      关于MongoDB的安装,已经有很多文章介绍了。

      这里推荐CNBLOGS网友 百灵 的

      安装这篇文章,应该可以正确安装MongoDB,其实就是下载和解压,完全绿色软件。

      这个系列的教程,我将MongoDB解压到:C:\runmongo,可执行文件则都在C:\runmongo\bin下面。

      新建一个MongoDB实例的方法很多,这里我新建了一个BAT文件,在BAT文件里面写了3句命令:

      第一句:将执行目录切换到Mongo可执行目录

      第二句:新建一个目录,MongoDB实例需要一个存放文件的目录,这里我选择新建一个C:\mongodb\magicdict 目录

      第三句,则是新建一个MongoDB实例,同时,将MongoDB实例的侦听端口设置为 28030

     关于MongoDB的启动参数,推荐 咫尺天涯的文章:

 

1 cd C:\runmongo\bin2 mkdir C:\mongodb\magicdict3 mongod --port  28030 --dbpath C:\mongodb\magicdict --rest

 

如果成功的话,将会有一个黑色的DOS控制台出现。当然,这个控制台只是日志输出,无法操作。你也可以将日志存放到一个文件里面。

 

这个时候去查看  C:\mongodb\magicdict,系统自动添加了一个 mongod.lock  锁文件。

接下来,启动可视化工具,看看数据库吧。

第一次启动时候,选择语言:

由于某些功能需要使用mongo的可执行文件,在可执行文件里面选择可执行文件路径

 下面是连接管理界面,里面列出了所有现存的连接

 单击添加按钮

          由于是最简单的数据库,我们只需要填写 连接名称,主机,端口号即可。

          连接名称:这个可以使任意字符,是便于用户记忆的。

          主机:这里填写服务器的IP地址,这里使用 localhost 表示本机

           端口:28030

这里你可以先使用 [测试] 按钮,检验一下设置是否正确。如果没有问题,则可以[添加]连接。

选中刚才建立的连接,按下[确定]按钮。则进入主界面。

界面左边的是当前连接(MongoDB实例)中所包含的数据库对象。当然,这个连接里面只是单纯的数据库。除了有一个系统自动生成的local数据库以外,什么都没有。

界面右边的是当前连接的状态信息。 关于这些状态信息,你可以参看官方的帮助文档:

 一般来说,我们不会在local系统目录里面添加数据,一般都会新建一个数据库来保存用户数据。

当然,你可以 选中Connection节点,然后用主菜单或者右键菜单来 [新建数据库]。不过,这里将演示如何使用C#来创建数据库,添加数据。

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using MongoDB.Driver;  6 using MongoDB.Bson;  7 using MongoDB.Driver.GridFS;  8 using MongoDB.Bson.Serialization.Attributes;  9  10 namespace MagicMongoDBTool.Module 11 { 12     public static class InitTestData 13     { 14         internal class User 15         { 16             [BsonId] 17             public String ID; 18             [BsonElementAttribute("fn")] 19             public String Name; 20             public Byte Age; 21             public Byte Age2; 22             public Byte Age3; 23             public Address address; 24         } 25         internal class Address 26         { 27             public String street; 28             public String City; 29             public String state; 30             public int Zip; 31  32         } 33         internal class GeoObject 34         { 35             [BsonId] 36             public String ID; 37             public int[] Geo; 38         } 39         internal class TLLObject 40         { 41             [BsonId] 42             public String ID; 43             public DateTime CreateDateTime; 44             public int Game; 45         } 46         public static void FillDataForGeoObject(MongoServer mongosvr) 47         { 48             MongoDatabase mongodb = mongosvr.GetDatabase("mongodb"); 49             MongoCollection
mongoCol = mongodb.GetCollection
("GEO"); 50 mongoCol.RemoveAll(); 51 Random Ro = new Random(); 52 ///HugeData 53 for (int i = 0; i < 1000; i++) 54 { 55 mongoCol.Insert(new GeoObject() 56 { 57 ID = i.ToString(), 58 Geo = new int[2] { Ro.Next() % 180, Ro.Next() % 180 } 59 //[-180,180] 如果已经有索引,则操作这个范围的记录无法插入数据库 60 }); 61 } 62 } 63 public static void FillDataForTTL(MongoServer mongosvr) 64 { 65 MongoDatabase mongodb = mongosvr.GetDatabase("mongodb"); 66 MongoCollection
mongoCol = mongodb.GetCollection
("TTL"); 67 mongoCol.RemoveAll(); 68 Random Ro = new Random(); 69 ///HugeData 70 for (int i = 0; i < 1000; i++) 71 { 72 mongoCol.Insert(new TLLObject() 73 { 74 ID = i.ToString(), 75 CreateDateTime = System.DateTime.Now.AddSeconds(i), 76 Game = Ro.Next() 77 }); 78 } 79 } 80 public static void FillDataForUser(MongoServer mongosvr) 81 { 82 MongoDatabase mongodb = mongosvr.GetDatabase("mongodb"); 83 84 MongoCollection
mongoJsCol = mongodb.GetCollection
("system.js"); 85 mongoJsCol.Insert
( 86 new BsonDocument().Add("_id", "sum") 87 .Add("value", "function (x, y) { return x + y; }")); 88 MongoGridFS mongofs = mongodb.GetGridFS(new MongoGridFSSettings()); 89 MongoCollection
mongoCol = mongodb.GetCollection
("User"); 90 mongoCol.RemoveAll(); 91 Random Ro = new Random(); 92 ///HugeData 93 for (int i = 0; i < 1000; i++) 94 { 95 mongoCol.Insert(new User() 96 { 97 ID = i.ToString(), 98 Name = "Tom", 99 Age = (byte)Ro.Next(100),100 Age2 = (byte)Ro.Next(100),101 Age3 = (byte)Ro.Next(100),102 address = new Address()103 {104 street = "123 Main St.",105 City = "Centerville",106 state = "PA",107 Zip = Ro.Next(20)108 }109 });110 }111 }112 }113 }

这里我新建了一个mongodb的数据库,同时新增了3个演示用数据集(collection)。

具体的操作方法,推荐 码农的文章: 

这里有非常详细的C#操作数据库的解释。全部是官方文档的翻译,可能是机器翻译的,但是对于英语不好的同志来说,有一定帮助。

当然,如果你的英语还可以,原汁原味的在这里:

MongoDB的对象存取,代码看上去有点ORM的味道,不过,由于MongoDB已经是阶层数据库了,完全不需要将Object进行映射(Map),而是直接存取到数据库中。

在简单类的时候,由于数据结构只是二维表格,这种优势不是很明显。在复杂类的时候,出现层次结构的时候,则效果非常明显。

下图则通过[树形视图]来直观展示了复杂阶层的类。

关系型数据库,需要将User数据和Address数据放在两张表中,然后用主键连接成视图。

阶层型数据库,则已经将User和Address信息放在一个文档(Document,类似于记录的概念)里面。

(当然,关系型的好处也非常明显,可以减少数据冗余,灵活性也非常好。阶层型数据库在编码上,可能更加贴近OOP)

 

 [索引-TTL索引]

 索引都是为了检索的性能而生的,MongoDB的索引也不例外。

 TTL(TimeToLive)索引(MongoDB2.2.2新增)和地理位置索引(“2d”)则是MongoDB的特色。

 TTL索引,索引对象是一个日期型字段,然后需要设定一个有效时间。通过监视 日期型字段的值和当前系统时间,参考有效时间,判断是否数据过期,对于过期的数据则自动删除。

 这个特性对于自动删除日志这样的操作来说,将非常有用。例如我们可以对于 日志创建时间 进行索引,同时设定过期时间为 3600秒,这样系统将自动删除一个小时之前的日志。

 这里我们准备了TTL这样的一个数据集:

 数据集里面包含了一个CreateDateTime的日期型字段,里面存放着建立记录的时间。

 接着我们选中数据集,通过索引管理器建立索引。

 我们将对于CreateDateTime建立所以,同时设定有效时间为180秒。

 这样的话,如果CreateDateTime和系统时间相差180秒,则记录将会被自动删除。

1.TTL索引必须建立在日期型字段(或者日期型字段数组)

2.不能建立在复杂索引上

3.你不能在 _id或者任何一个已经存在索引的字段上建立TTL索引

TTL索引的官方说明: 

注意上面这张图的左边,显示了数据集的索引信息:

AutoDelete的索引过期时间为180秒。而默认的索引_id,则没有设定过期时间。

同时,里面的数据已经全部被系统自动删除掉了。

[索引-GEO索引]

如果,你的数据集里面有一个地理位置字段(所谓的地理位置字段,是一个数组,数组里面有两个数字,数字的范围是 [-180,180])。

例如,下面的Geo字段,就是一个地理位置字段。

 我们可以对于地理位置字段,进行“2d”索引,或者说是Geo索引。

观察一下索引类型:这里显示的是 “2d”,表示这是一个Geo地理索引

建立过地理索引的数据集,可以进行GeoNear查询。

官方文档: 

GeoNear的意思就是:查询一下,指定的坐标附近,有那些记录。

你可以指定:  1.需要查询多少个最邻近的记录。

                  2.你可以限制最大的距离。

                  3.由于地理坐标的单位是弧度【-180,180】,有时候你需要将距离放大一些,你可以指定距离乘积

                 4.Spherical(球形)

下面我们要查询离坐标 【100,100】,距离在10以内的记录,我们限制最多查询100个记录。

并且我们不需要系统对于距离进行放大或者缩小的处理。

查询结果:我们扫描了23个记录(由于有索引,所以不需要扫描全部记录),扫描时间为0

              符合条件的记录有6个,平均距离为 6.34 最大距离为 9.21

              每条记录的详细信息都可以在结果里面看到。

 

            

转载于:https://www.cnblogs.com/TextEditor/archive/2013/01/03/2843141.html

你可能感兴趣的文章
[leetcode] 7. Reverse Integer (easy)
查看>>
HTML(三)标签之间的‘潜’规则
查看>>
css文字两端对齐
查看>>
类常量的定义和静态常量的定义和调用
查看>>
win7下80端口被(Pid=4)占用的解决方法
查看>>
HDU 4460 Friend Chains ( BFS )
查看>>
复选框全选后台删除操作。
查看>>
福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
查看>>
第六周学习笔记,vc各类控件的输入输出
查看>>
转义字符
查看>>
SVN服务器的搭建(三)
查看>>
laravel5.1框架model类查询实现
查看>>
charCodeAt方法以及Unicode中文汉字编码范围
查看>>
编程珠玑(续) 读书笔记 -(第三章 程序员的忏悔)
查看>>
JAXP Dom 案例 对xml文件进行增加 查找 删除
查看>>
Dash:程序员的好帮手
查看>>
利用DexClassLoader动态加载dex文件
查看>>
mosquitto配置文件/etc/mosquitto/mosquitto.conf配置参数详细说明
查看>>
python 提交SVN 写更新日志
查看>>
机器学习:python中如何使用朴素贝叶斯算法
查看>>