目录

涵盖的主题

安装

MongoDB配置

MongoImport –使用大型数据集初始化数据库

MongoDB – LINQ支持

如何在特定城市中找到要做的事情

运行更快的查询

组项目

接下来


让我们使用.NET Core和MongoDb构建一个简单的WebApi,以查询全球不同目的地的详细信息。我们将使用运行于不同场景的MongoDb LINQ进行搜索。

有关如何使用MongoDB构建和测试完整的.NET CORE WebApi的简要介绍,请查看我之前的文章:将MongoDB .NET驱动程序与.NET Core WebAPI一起使用。

本文继续其他两个部分:

  • 第2部分– MongoDB中的分页–如何真正避免性能下降?
  • 第3部分– MongoDb和LINQ:如何汇总和加入集合

您可以在GitHub上找到该项目:github.com/fpetru/WebApiQueryMongoDb

在本文中,我将使用两个数据集:

  • Wikivoyage提供了全球最受旅行者欢迎的博物馆、景点、餐厅和酒店的更多详细信息。原始数据集可以从下一个url访问。
  • 第二个数据集来自GeoNames,它是一个覆盖所有国家的地理数据库。出于演示目的,我只选择了人口超过5000的城市。

使用这些数据集,可以更轻松地运行一些示例查询,以检索一致数量的数据。

涵盖的主题

  • MongoDb –安装和安全设置
  • MongoDB –使用mongoimport工具
  • 制作一个完整的ASP.NET WebApi项目,使用MongoDB C#Driver v.2异步连接
  • 运行LINQ查询

安装

这是所有需要安装的东西:

  • Visual Studio Community 2017,包括.NET Core选项
  • MongoDB和Robomongo

MongoDB配置

安装MongoDB之后,您将需要配置访问权限以及数据所在的位置。

为此,请在本地创建一个名为mongod.cfg的文件。这将包括设置到MongoDB服务器的数据文件夹以及到MongoDB日志文件的路径,最初不进行任何身份验证(最后两行被注释)。请使用您的本地设置更新这些本地路径

systemLog:destination: filepath: "C:\\tools\\mongodb\\db\\log\\mongo.log"logAppend: true
storage:dbPath: "C:\\tools\\mongodb\\db\\data"#Once the admin user is created, remove the comments, and let the authorization be enabled
#security:
#  authorization: enabled

命令提示符下运行。这将启动MongoDB服务器,指向已经创建的配置文件(如果服务器安装在自定义文件夹中,请首先更新命令)

"C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe" --config C:\Dev\Data.Config\mongod.cfg

服务器启动后(您可以在日志文件中看到详细信息),在命令提示符下运行mongo.exe 。下一步是将管理员用户添加到数据库中。使用完整路径(例如:“ C:\Program Files\MongoDB\Server\3.4\bin\mongo.exe”)运行MongoDB,然后将以下代码复制并粘贴到控制台中:

use admin
db.createUser({user: "admin",pwd: "abc123!",roles: [ { role: "root", db: "admin" } ]}
);
exit;

停止服务器,从mongod.cfg文件中取消最后两行的注释,然后重新启动MongoDb服务器。

MongoImport –使用大型数据集初始化数据库

我们将从Wikivoyage开始。该数据集最初在此处可用(链接)。为了更轻松地导入它,我对其进行了稍微的转换(更改为制表符分隔的文件,并应用了最小限度的数据清理)。该文件位于Github中(链接)。

第二个数据集GeoNames在同一个Github文件夹(链接)中可用。

运行脚本import.bat(与datsets位于同一文件夹中),将导入数据,并创建一个名为TravelDb的新数据库和相关索引。脚本包含在此处,但是最好只运行脚本文件:

mongoimport --db TravelDb ^--collection WikiVoyage ^--type tsv ^--fieldFile enwikivoyage-fields.txt^--file enwikivoyage-20150901-listings.result.tsv^--columnsHaveTypes^--username admin ^--password abc123! ^--authenticationDatabase admin ^--numInsertionWorkers 4mongoimport --db TravelDb ^--collection Cities ^--type tsv ^--fieldFile cities5000-fields.txt^--file cities5000.txt ^--columnsHaveTypes^--username admin ^--password abc123! ^--authenticationDatabase admin ^--numInsertionWorkers 4

字段文件指定字段名称及其关联的类型。使用optionsHaveTypes选项,我们可以使用所需的类型(例如,int,double,string等)进行导入。

结果应如下所示:

MongoDB – LINQ支持

此处包含的.NET Core解决方案采用与我以前的文章(将MongoDB .NET驱动程序与.NET Core WebAPI结合使用)相同的结构。在那里,我已经提供了按步操作指南,内容涉及如何从头开始创建WebApi解决方案,连接到MongoDB以及实现REST API的所有基本操作。

相比之下,此处,Web控制器将仅执行一个操作(GET)–主要集中于运行不同的查询:

[NoCache]
[HttpGet]
public Task> Get()
{return GetTravelItemsInternal();
}private async Task> GetTravelItemsInternal()
{return await _travelItemRepository.GetTravelItems();
}

在后台,查询使用LINQ语法运行,并返回前500条记录。

public async Task> GetTravelItems()
{try{return await _context.TravelItems.Take(500).ToListAsync();}catch (Exception ex){// log or manage the exceptionthrow ex;}
}

该查询在服务器上呈现,并且我们仅接收有限的数据集。这是可能的,因为我们拥有由MongoDB C#驱动程序本地提供的IQueryable类型接口。

...
using MongoDB.Driver.Linq;
...
public IMongoQueryable TravelItems
{get{return _database.GetCollection("WikiVoyage").AsQueryable();}
}

如何在特定城市中找到要做的事情

假设我们想找到在城市中要做的有趣的事情。我们要么按照动作类型显示城市中的所有物品,要么只选择一个特定的动作(例如,买,做,吃,喝等)。

public async Task> GetTravelItems(string cityName, string action)
{try{if (action != null)return await _context.TravelItems.Where(p => p.City == cityName && p.Action == action).ToListAsync();return await _context.TravelItems.Where(p => p.City == cityName).OrderBy(p => p.Action).ToListAsync();}catch (Exception ex){// log or manage the exceptionthrow ex;}
}

该方法将由GET函数调用。假设我们要搜索在巴黎要做的有趣的事情(http://localhost:61612/api/travelquery/Paris?doAction=do),我们会得到有趣的结果,其中一个如下所示:

运行更快的查询

一种提高查询速度的方法是应用索引。建议在City和Action之后在集合中进行搜索,建议使用这两个字段添加一个简单的索引。

使用mongo shell执行JavaScript文件,将在City上添加索引,然后在Action上添加索引。

db = db.getSiblingDB('TravelDb');
db.WikiVoyage.createIndex( { City: 1, Action: 1 } );

检索速度将从平均0.150毫秒增加到大约0.001毫秒。

组项目

如果我们只想看到头条新闻该怎么办?无需详细说明哪些类型的操作可用于特定城市?

一个按城市操作字段分组的查询示例为:

await _context.TravelItems.GroupBy(grp => new { grp.City, grp.Action }).Select(g => new { g.Key.City, g.Key.Action }).ToListAsync();

接下来

我将创建本文的第二部分,添加分页支持以及较新的MongoDB版本带来的聚合增强功能,同时还要考虑第二个数据集。也许你知道这些,也许你学到了一些东西。您想看到更多东西吗?

如何搜索旅行的好地方(MongoDb LINQ和.NET Core)相关推荐

  1. mongodb 全文搜索---ttlsa教程系列之mongodb(十)

    为什么80%的码农都做不了架构师?>>>    mongodb full text search(fts:全文搜素)是在版本2.4新加的特性.在以前的版本,是通过精确匹配和正则表达式 ...

  2. MongoDb和LINQ:如何汇总和加入集合

    目录 开始之前的注意事项 安装 运行项目 在MongoDb中使用GroupBy 有关MongoDb中聚合的更多信息 MongoDb支持Jion 使用Javascript访问WebApi 您可能也有兴趣 ...

  3. MongoDB中的分页–如何真正避免性能下降?

    目录 从哪儿开始 ? 涵盖的主题 安装 查看结果 使用cursor.skip()和cursor.limit()分页结果 使用最后一个位置分页 LINQ格式 Mongo的ID 返回较少的元素 Mongo ...

  4. 将MongoDB.NET驱动程序与.NET Core WebAPI一起使用

    目录 您可能也有兴趣 技术栈 安装 创建ASP.NET WebApi项目 配置 依赖注入和选项模型 MongoDB配置 MongoDB .NET驱动程序 模型 定义数据库上下文 添加存储库 添加主控制 ...

  5. MongoDB学习指导

    原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...

  6. 关于Mongodb的全面总结

    MongoDB的内部构造<MongoDB The Definitive Guide> MongoDB的官方文档基本是how to do的介绍,而关于how it worked却少之又少,本 ...

  7. 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始!

    转载地址:http://blog.csdn.net/he90227/article/details/45674513 原文地址:http://blog.csdn.NET/jakenson/articl ...

  8. MongoDB 全面总结

    原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...

  9. MongoDB全面总结

    原文地址:http://blog.csdn.net/jakenson/article/details/7060431 MongoDB的内部构造<MongoDB The Definitive Gu ...

最新文章

  1. 谷歌或被迫拆分Chrome浏览器,谁将会接盘?
  2. 带入gRPC:gRPC Streaming, Client and Server
  3. 不含抽象方法的抽象类 java_Java:抽象类继承非抽象类,且不包含抽象方法有何负面作用吗?...
  4. OpenVINO InferenceEngine之读取IR
  5. 冲刺阶段站立会议每天任务1
  6. Android之ViewPager中包含ViewFlipper时实现双滑动嵌套解决父控件干扰问题
  7. 智能建筑--常见协议
  8. 正式环境docker部署hyperf_忍受不了 docker 环境下 hyperf 启动等待时间,教你如何通过 win10 子系统快速运行 hyperf...
  9. 正则表达式 Java
  10. tftp java_TFTP服务器搭建
  11. Win10投影到此电脑用不了,投影此电脑是灰色
  12. 计算机产品校园营销方案,惠普笔记本电脑校园营销策划方案.doc
  13. 利用webmagic爬去招聘信息,并输入到Hbase数据库中
  14. 排序函数qsort和sort那点事
  15. word批量调整图片大小
  16. java ios 3des_IOS开发入门之iOS 3DES加密 和 java 3DES 解密
  17. 8月5号 图论,拓扑排序入门
  18. 服务器磁盘爆满,好捉急呀,如何清理MySQL日志?
  19. 易中天品三国--要点记录
  20. 【卖家必看干货】4大高效评价请求模板,激活各类买家

热门文章

  1. python 调用另一个py_Python打包:setuptools与setup.py/.cfg入门简介
  2. 删除同域名所有cookies_Namesilo域名解析DNS设置教程
  3. 随机数插入排序c 语言,C语言程序设计100例之(22):插入排序
  4. 必备的中国风PNG免扣元素点缀,尽显国潮韵味
  5. c语言筛选法_「干货」C语言经典算法筛选法求质数,极少数人用过的素数求解法...
  6. C++ #define参数问题
  7. Linux 内核编译 LOCALVERSION 配置(分析内核版本号自动添加的“+“号)
  8. 《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)
  9. reg51.h和reg52.h头文件
  10. Turbo码:3GPP TS 36.212