Nest JS / MongoDB - 地理空间索引在部署的服务器上不起作用

Posted

技术标签:

【中文标题】Nest JS / MongoDB - 地理空间索引在部署的服务器上不起作用【英文标题】:Nest JS / MongoDB - geospatial index not working on deployed server 【发布时间】:2021-10-23 23:24:59 【问题描述】:

我正在用 NestJS 编写一个 API,它获取存储在 MongoDB 数据库中的数据并使用 GraphQL 将其返回。它应该使用名为location 的属性获取Devices - 一个GeoJSON 点。上面还有一个2dsphere 索引,它允许使用$geoNear 查询在一个圆圈中搜索Devices。在本地机器上一切正常,但是当 API 部署在服务器上时,在循环中查询 Devices 不会返回任何记录,尽管存在记录和索引。

搜索查询如下所示:

  const location = [input.center.lng, input.center.lat]

  return [
    
      $geoNear: 
        near: 
          type: 'Point',
          coordinates: location
        ,
        distanceField: 'distance',
        maxDistance: input.radius,
        key: 'location'
      
    
  ]

DevicesService 使用此管道:

数据库使用 Kubernetes 部署。这是配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.22.0 (955b78124)
  creationTimestamp: null
  labels:
    io.kompose.service: v3-ds-mongo
  name: v3-ds-mongo
spec:
  replicas: 1
  selector:
    matchLabels:
      io.kompose.service: v3-ds-mongo
  strategy:
    type: Recreate
  template:
    metadata:
      annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.22.0 (955b78124)
      creationTimestamp: null
      labels:
        io.kompose.service: v3-ds-mongo
    spec:
      containers:
        - env:
            - name: MONGO_INITDB_ROOT_PASSWORD
              value: password
            - name: MONGO_INITDB_ROOT_USERNAME
              value: root
          image: mongo:latest
          name: v3-ds-mongo
          ports:
            - containerPort: 27017
          resources: 
          volumeMounts:
            - mountPath: /data/db
              name: v3-ds-mongo-claim0
      restartPolicy: Always
      volumes:
        - name: v3-ds-mongo-claim0
          persistentVolumeClaim:
            claimName: v3-ds-mongo-claim0
status: 

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

索引也应该在服务器上创建,您可以手动执行但效率不高,但是您可以为数据库创建一个初始化文件来定义索引:

connection = new Mongo();

db = connection.getDB("database_name")

db.users.createIndex( location: '2dsphere' )

并在您的配置中引用该文件

【讨论】:

以上是关于Nest JS / MongoDB - 地理空间索引在部署的服务器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

mongoDb地理空间索引和查询

MongoDB的地理位置索引

MongoDB——索引类型之地理空间索引(Geospatial Index)

MongoDB中地理空间索引的内部机制

MongoDB地理空间查询结果未按距离顺序排列

通过 GeoServer 在 MongoDB 中提供地理空间数据