Mongodb的地理位置索引的简单使用示例

前言

如果是LBS相关的项目,一般会对一些地理位置及相关数据做操作。一般存储每个地点的经纬度的坐标,组成点坐标或是多边形、矩形、圆形等区域,也可能是球面。

这边会涉及一些应用场景,比如一辆车越过电子围栏区域触发报警,就比如查询一个点是否在指定区域内。或查询某个坐标点附近的地理位置场所坐标,而Mongodb专门针对这种查询建立了地理空间索引,主要分为2d和2dsphere两种分别是针对平面和球面。Mongo的位置信息查询性能非常高。

查询点是否在区域内

 

0

MongoDB聚合查询以及和MySQL类比总结

可能大家对mysql的查询都比较熟悉,对mongodb的查询不是太熟练,为了便于理解,先将常见的mongo的聚合操作和mysql的查询做下类比。

SQL 操作/函数   mongodb聚合操作
where$match
group by$group
having$match
select$project
order by$sort
limit $limit
sum()$sum
count()$sum
join$lookup  (v3.2 新增)

假设有一张orders表,里面有数据

1.统计orders表所有记录

mongodb查询mysql查询
db.orders.aggregate( [
{
$group: {
_id: null,
count: { $sum: 1 }
}
}
] )
SELECT
COUNT(*) AS count
FROM orders

2.对orders表计算所有price求和

mongodb查询mysql查询
db.orders.aggregate( [
{
$group: {
_id: null,
total: { $sum: “$price” }
}
}
] )
SELECT
SUM(price) AS total
FROM orders

3.对每一个唯一的cust_id, 计算price总和

mongodb查询mysql查询
db.orders.aggregate( [
{
$group: {
_id: “$cust_id”,
total: { $sum: “$price” }
}
}
] )
SELECT cust_id,
SUM(price) AS total
FROM orders
GROUP BY cust_id

4.对每一个唯一对cust_id和ord_date分组,计算price总和,不包括日期的时间部分

mongodb查询mysql查询
db.orders.aggregate( [
{
$group: {
_id: {
cust_id: “$cust_id”,
ord_date: {
month: { $month: “$ord_date” },
day: { $dayOfMonth: “$ord_date” },
year: { $year: “$ord_date”}
}
},
total: { $sum: “$price” }
}
}
] )
SELECT cust_id,
ord_date,
SUM(price) AS total
FROM orders
GROUP BY cust_id,
ord_date

0

MongoDB 时间戳转日期格式统计

在日常中经常出现时间戳存在mongodb里的情况,以下就是根据时间戳转日期格式

生成数据

查询数据

按时间戳create_time查询按天分组

查询结果

0

解决MongoDB连接错误:error: couldn’t connect to server 127.0.0.1:27017 src/mongo/shell/mo

报错信息

[color=orange][b][size=large]error: couldn’t connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js[/size][/b][/color]

解决方法

方法1

1.将D:\MongoDB\db\里所有文件删除
2.net stop MongoDB
3.cmd–D:–cd MongoDB–cd bin:
mongod.exe –dbpath=d:\mongodb\db
mongod.exe –dbpath=d:\mongodb\db –logpath=d:\mongodb\logs\mongodb.log –install –serviceName “MongoDB”
4.cmd–net start MongoDB(Mongo DB已启动)
5.在浏览器中输入http://localhost:端口号

方法2

1.确认服务是否启动,没有则先启动服务:net stat MongoDB
2.若服务已经启动,则有可能是上次不正常关闭MongoDB,导致存放数据的文件被占用锁住了。只需将D:\MongoDB\db中的mongod.lock文件删除掉。重新启动服务net stat MongoDB即可。

0

Node里使用Redis作为MongoDB数据库的中间缓存

MongoDB是世界上最受欢迎的NoSQL数据库之一。 系统的简单性使其易于调整和维护。

当我们在Web服务中使用MongoDB之类的数据库时,我们往往会忽略其中的性能部分。当数据库扩展到一个很大的容量时,它可能会变慢。 原因可能是基础架构设置或系统配置不正确(如无索引等)。 如果您的Web服务器和数据库服务器在不同的系统上运行,那么延迟也会成为问题。 这些都会影响服务的响应时间,从而影响整个应用程序的性能。

为了解决这些问题,我们应该在系统中引入数据库缓存。

什么是缓存

缓存是计算机科学中的一种技术,用于将经常访问的数据存储在临时存储区(称为缓存)中,以减少硬盘驱动器的读写次数。 我们的计算机有一个缓存,浏览器有一个缓存,Web服务器有一个缓存,本文也是从缓存中检索的。缓存无处不在,这种技术可以使您的Web应用程序的性能飞速增长。

工作原理

用户请求您的服务时。 Web服务器首先读取或写入数据库,然后返回响应。 对于缓存,服务器首先检查缓存副本是否存在,如果存在,它将从缓存中返回数据,而不是询问数据库。 它节省了时间和数据库的计算量。

示例应用程序

让我们构建一个简单的网络服务应用程序,该应用程序公开一个API以从MongoDB数据库中读取数据。

让我们开始一个新的项目。

然后运行此命令创建一个Node项目。

让我们下载依赖项。

Node dependencies

主要代码

app.js代码

models.js代码

运行代码并检查其工作情况。

结果

Redis缓存

添加Redis Cache让我们在代码中添加Redis缓存。

更新后的 models.js

在getArticle函数中代码中,我们正在使用ID参数检查缓存是否存在。 如果确实存在,我们将不做进一步处理就返回数据。 如果缓存不存在,我们将在MongoDB中查找该数据并将其添加到缓存中(如果找到)。逻辑很简单并且可以正常工作。再次运行该应用程序并检查工作情况。

保持缓存更新

缓存存在多长时间? 当有新的或更新的数据时会发生什么? 引入缓存时,我们需要解决这样的问题。保留缓存的时间取决于系统。 我将缓存保留了24小时,然后再次对其进行了重建。 根据数据的更新频率,您可能需要1个小时或100个小时。更新数据时,我们只需更新Redis缓存或从Redis中删除条目即可让系统重建缓存。

缓存策略

上面显示的代码库是基本的缓存系统。 不建议将所有内容都放在缓存中,这也会减慢系统速度。 我们只应将这些数据放入对“最受欢迎的文章”有很高要求的缓存中。Redis内置了各种缓存策略,我建议使用LRU(最近最少使用)缓存策略。 此策略将删除最近最少使用的缓存项。启动Redis时,可以将算法作为参数传递。

总结

在本文中,我们研究了缓存及其如何在构建高性能系统中使用。 数据库缓存是一个了不起的概念,越来越多的系统都在使用缓存。

0