mongodb中非常好用的Aggregate入门教程

前言

aggregate 翻译过来是聚合的意思, 但是在实际的使用的它的体验特别像linux中的管道, 每个管道处理完之后再把结果交个下一个管道, 你的数据就像水流, 最后通过各个管道你能够得到你想要的数据

我们一般用Aggregate做什么

aggregate查询文档

  • 聚合 平均数 等数据处理 group sum
  • 地理位置信息 $geoNear
  • 基本上mongodb的所有查询操作我们都可以用 aggregate实现, 用好这个基本上是万金油了

在这里我主要想记录一下mongodb在地理位置信息查询中使用到的技术,不仅可以查询到 距离 还可以按照距离排序

$geoNear 地理位置信息查询

首先我们的坐标数据在库里面怎么存, 类型为 Array , 记得加 2d 索引, 当然还有3d 索引, 目前还没有用到

 const storeschema = new mongoose.Schema({
  name: { type: String, required: true },
  point: { type: Array, required: true }, // [lon, lat]
 });
 storeschema.index({ point: '2d' });
 return mongoose.model('store', storechema);

然后按照就是地理查询代码了

this.ctx.model.Store.aggregate([{
    $geoNear: {
     spherical: true, // spherical 是否按照球形状来求距离
     distanceMultiplier: 6378137,
     maxDistance: 10000,
     near: [ lon1, lat1 ],
     distanceField: 'dist',
     key: 'point',
     query: {
     }
    },
 },
 //distanceMultiplier 这个参数是用于确定你返回的距离是什么单位 6378137 的单位是m
 //maxDistance 查询的最大距离
// near 中心点坐标
// distanceField 距离放在哪个属性
// key 保存坐标数据的地方
// query 你的过滤条件                

有一个很有意思的地方是 match 所以在这里有一个 query属性来补齐这种遗憾

但是你可以在   后面 使用$match 对查到的所有地理位置信息数据做再一次的筛选

$lookup mongodb中的联表查询

$lookup 是在比较新的mongodb版本中才能使用的属性, 当然这个属性也是用于 aggregate中的, 它补齐了之前mongodb中无法联表的遗憾

看代码

await this.ctx.model.MemberInfo.aggregate([
        {
          $match: { store: new ObjectId(store) }
        },
        {
          $lookup: {
            from: 'users',
            localField: 'user',
            foreignField: '_id',
            as: 'user'
          }
        },
        {
          $replaceRoot: { newRoot: { $mergeObjects: [{ $arrayElemAt: [ '$user', 0 ] }, '$$ROOT' ] } }
        },
        {
          $match: { 'certification.name': { $regex: search } }
        },
        {
          $project: { _id: 1 }
        }
      ]);

memberinfo 与 user 表在这里我想要获取 memberinfo  localField: 'user' 为外键对应 user表 foreignField: '_id' _id字段他的额外属性...

说白了 我的会员表里面只存了用户的id  现在我想要拿到用户的 其它信息...

附上链接吧 $lookup

写在最后

当然说他是查询万金油他当然支持 定义数据的输出  limit $sort 等常规操作

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目

    项目: vue + express + mongodb 项目前后分离部署在一台服务器上面 express端口:3000 mongodb端口:27017 vue端口:本地是8080 服务端是:80 本地开发配置 本地开发基于vue cli 端口是 8080如果请求api的时候在前缀加上localhost:3000会提示跨域问题,我们可以使用下面方式来解决这个问题 在vue项目路径找到这个文件 /vue-item/config/index.js 找到这行代码: proxyTable: {} 添加如下

  • mongodb实现数组对象求和方法实例

    前言 mongodb在计算集合数组值时候,我们通常会想到使用$group与$sum,但是如果是数组里面多个json对象,并且还需要根据条件过滤多个对象的内容该如何处理? 现在让我们来实现它,假设mongodb中有个user集合,其数据内容如下: /* 1 */ { "_id" : ObjectId("5c414a6a0847e00385143003"), "date" : "2019-01-18 09", "data

  • Docker容器化部署尝试——多容器通信(node+mongoDB+nginx)

    原因是这样的 想要部署一个mocker平台,就在朋友的推荐下选择了 api-mocker 这个现成的项目 该项目分为服务端node.客户端vue.以及数据库mongoDB 在尝试直接部署的时候发现需要装一大堆的环境,node.mongo.nginx啊,特别的麻烦,之前简单的使用过docker,就在想能不能用docker免环境直接部署呢?于是就有了这次的尝试 多容器通信 该项目分为3个部分,于是就要建立3个容器(node.mongo.nginx) 那容器之间怎么实现通信呢? # 通过link指令建

  • 详解Java 连接MongoDB集群的几种方式

    先决条件 先运行mongodb肯定是必须的,然后导入以下包: import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; import com.mongodb.ServerAddress; import com.mongodb.MongoCredential; import com.mongodb.MongoClientOptions; MongoClient MongoClient()实例表示到数据库的连接池; 你将只需

  • mongodb BSON的基本使用教程

    查找 Find m := bson.M{ "create_time": bson.M{ "$gte": start, "$lte": end, }, "account": account, "tag": "tag", } session.DB("db").C("collect").Find(m).Count() 这里查找时间戳内,账号为accoun

  • c#操作mongodb插入数据效率

    mongodb的数据插入速度是其一个亮点,同样的10000条数据,插入的速度要比Mysql和sqlserver都要快,当然这也是要看使用者怎么个使用法,你代码如果10000次写入使用10000次连接,那也是比不过其他数据库使用事务一次性提交的速度的. 同样,mongo也提供的一次性插入巨量数据的方法,因为mongodb没有事务这回事,所以在在C#驱动里,具体方法是InsertManyAsync()一次性插入多个文档.与之对应的是InsertOneAsync,这个是一次插入一个文档: Insert

  • mongodb使用c#驱动数据插入demo

    Mongodb提供了多种开发语言的驱动,java,python,c++,c# 等,这里选用c#驱动作为测试: 首先上mongo官网下载驱动.Ps:官方网站经常连接不顺利. 还不如直接在vs的nuget管理包中搜索mongoDB.driver. 需要引入的命名空间: using MongoDB.Bson; using MongoDB.Driver; Driver是驱动核心,Bson是和数据格式相关的: 定义一个mongo客户端,一个mongodb,一个数据集合: protected staticI

  • mongodb官方的golang驱动基础使用教程分享

    前言 mongo数据库在nodejs平台有2个常用驱动,mongodb和mongoose,mongodb接口非常接近mongo数据库原生的操作方式,是helloworld之类演示代码的首选mongo数据库连接驱动,因此成为大部分nodejs初学者最先接触的mongo数据库驱动.初学者在学会mongo连接的同时,却也可悲的被helloword这种演示性质的数据库操作习惯潜移默化了. 本文主要介绍的是关于mongodb官方的golang驱动使用的相关内容,下面话不多说了,来一起看看详细的介绍吧 使用

  • pyspark操作MongoDB的方法步骤

    如何导入数据 数据可能有各种格式,虽然常见的是HDFS,但是因为在Python爬虫中数据库用的比较多的是MongoDB,所以这里会重点说说如何用spark导入MongoDB中的数据. 当然,首先你需要在自己电脑上安装spark环境,简单说下,在这里下载spark,同时需要配置好JAVA,Scala环境. 这里建议使用Jupyter notebook,会比较方便,在环境变量中这样设置 PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS=

  • Java mongodb连接配置实践

    之前百度,google了很多,发现并没有介绍mongodb生产环境如何配置的文章, 当时想参考下都不行, 所以写篇文章,大家可以一块讨论下. 1. MongoClientOptions中的连接池配置: 配置如下: connectionPoolSettings = ConnectionPoolSettings.builder() .minSize(getMinConnectionsPerHost()) .maxSize(getConnectionsPerHost()) .maxWaitQueueS

随机推荐