MongoDB自带一个Javascript shell它可以从命令行与MongoDB实例交互。这个shell非常有用通过它可以管理操作、检查运行实例、查询数据等操作。让我们再回到命令行窗口模式下吧没办法MongoDB只提供这种界面运行mongo.exe 如下图这就是MongoDB的客户端的命令行模式了。通常我们在操作数据库前要切换【当前数据】MongoDB也是一样我们可以运行如下命令来查看数据库列表并切换数据库然后再查看集合列表请看下图我运行了三条命令注意MongoDB区分名字的大小写。在MongoDB中查看【当前数据库】可以使用命令【db】查看集合Customer的记录总数【db.Customer.count();】查看 CustomerId 1 的记录【db.Customer.findOne({_id : 1});】注意查询条件是一个文档这就是MongoDB的特色。下图显示了上面三条命令的执行结果嗯怎么有乱码CustomerId 1 的记录应该是这样的才对呀看到这一幕您应该不要怀疑是MongoDB的错了这个错误是由于MongoDB的客户端使用的编码是UTF-8 而Windows 命令行程序 cmd.exe 使用的gb2312(我目前使用中文语言) 造成的。解决办法1. 执行MongoDB的【exit】命令退回到Windows命令行状态或者重新打开命令行窗口2. 运行命令【chcp 65001】切换到UTF-8编码下工作。3. 设置命令行窗口的属性请参考下图再运行 mongo 进入mongo命令行切换数据库并执行命令【db.Customer.findOne({_id : 1});】现在可以看到汉字能正常显示了但最后却显示Failed to write to logfile对于这个问题我们如果执行命令 【db.Customer.findOne({_id : 91});】(id91的记录就是我最后录入的全是a的那条前面截图上有) 可以发现没有任何异常发生因此认为这个问题还是和cmd.exe有关的。 如果切换回 chcp 936 这时将看到乱码但没有Failed to write to logfile所以我将忽略这个错误。回到顶部使用MongoDB的客户端维护数据下面我来演示一下如何使用MongoDB的客户端来执行一些基本的数据维护功能。还是从CRUD操作开始吧请看下图为了方便我将在一个截图中执行多个命令。注意MongoDB的文档使用的是一种称为BSON格式的对象与Javascript中的JSON类似。在上面的示例中每个命令后我加了一个红圈。在示例中我先切换到 MyTest 数据库它并不存在但没关系 然后我定义了一个文档 item 并插入到集合 table1 中然后又定义了一个文档 item2也插入到集合 table1 中。 注意item , item2 的结构完全不同但能放在一个集合中不建议这样做。最后调用 find() 显示集合中的所有文档。此时您有没有注意到【每个文档有一个名为 _id 的成员】我可没有定义啊。其实MongoDB会为每个文档都创建这样一个文档成员我们指定的 key, id 对于MongoDB来说 它们并不是【文档的主键】MongoDB只认 _id你可以指定但如果不指定MongoDB就自动添加。此时你可以看看前二张图片可以发现在定义Customer类时有一个成员CustomerID此时却不存在 我们可以再看一下Customer的定义public sealed class Customer { [MongoId] public string CustomerID { get; set; } public string CustomerName { get; set; } public string ContactName { get; set; } public string Address { get; set; } public string PostalCode { get; set; } public string Tel { get; set; } }此时您应该发现CustomerID这个成员有一个[MongoId]的特性。正是由于这个特性驱动程序将把CustomerID映射为_id来使用。好了再次回到命令行我要演示其它的命令。请看下图为了要更新某个文档我们要使用findOne()方法找到要修改的文档对象并将它保存一个变量t中然后修改它的属性 接着调用update()方法就可以更新文档了注意在调用update()时第一个参数【更新范围】是采用文档的形式给出的 第二参数才是要更新的新对象。在删除时删除条件也是采用文档的形式指定的。处处使用文档这就是MongoDB的特色。前面的示例代码中我使用了find()和findOne()它们是有区别的findOne()只返回一个文档对象find()返回一个集合列表 如果不指定过滤范围它将返回整个集合但在客户端中最多只显示前20个文档。再来个复杂的查询搜索日期范围是 2011-06-25 到 2011-06-26 之间的订单记录。由于返回的结果太长我的截图将不显示它们。注意MongoDB的查询条件中并没有 , , , 这些运算符而是使用 $lt, $lte, $gt, $gte 这种方式作为文档的KEY来使用的 因此一个简单的 OrderDate 2006-06-25 and OrderDate 2006-06-26 要写成如下方式如果遇到 or 就更麻烦了如CustomerId 1 or CustomerId 2 有二种写法语法不难相信能看懂JSON的人也能看懂这二条命令。再来个分页的命令与LINQ的语法类似好理解。MongoDB客户端还支持其它的语法这里就不一一介绍了。因为我们的目标是在C#中使用MongoDB在MongoDB提供的C#驱动中 我们并不需要写那样麻烦的查询条件只需要按LINQ的语法写查询就可以了因此会很容易使用。 不过有些维护性的操作我们只能通过命令的方式去执行比如删除集合删除数据库。执行【db.runCommand({drop : table1});】便可以删除一个集合也可以执行命令【db.table1.drop();】二者的效果是一样的。再来看看如何删除数据库的命令注意命令【db.runCommand({dropDatabase: 1});】只能删除【当前数据库】所以要先切换当前数据库 然后执行这个命令执行删除数据库的命令后我们再用命令【show dbs;】发现数据库【MyTest】已不存在即删除成功。 删除数据库还有一个方法还记得我前面启动mongod.exe时给它传递了一个参数 【-dbpath H:\AllTempFiles\mongodb\data】吗 我们现在去那个目录看一下有什么东西。看了这张图您有没有想过这二个以【MyNorthwind】开头的文件会不会就是数据库的文件呢 我现在就删除看看先停止mongod.exe然后删除文件由于我目前只有一个数据库我把目录下的文件全删除了删除后现在我再来启动mongod.exe然后在客户端执行命令【show dbs;】看看现在可以发现我们之前的【MyNorthwind】数据库没有了当然也就是删除了。 说明一下现在这二个数据库是MongoDB自带的用于特殊用途的我们可以不理会它们。好了我们还是再来看看MongoDB提供的C#驱动提供了什么东西吧。