Вопрос:

почему mongodb возвращает ошибку географического индекса?

angular mongodb express mongoose

24 просмотра

1 ответ

11 Репутация автора

Я создаю приложение, в котором пользователи могут публиковать задания, и я могу загружать задания, которые находятся рядом с текущим пользователем. Со стороны клиента я публикую запросы, которые затем используются в бэкэнде для ответа на результаты пользователей рядом со мной. Вместо того, чтобы получить результат, я получаю сообщение об ошибке, что индекс не был создан.

Я использую postpost для проверки отправки запросов, это ничем не отличается от выполнения на стороне клиента.

файл схемы

const mongoose = require('mongoose')
const schema = mongoose.Schema;

const userSchema = new schema({
  username: String,
  password: String,
  first_name: String,
  last_name: String,
  email: String,
  phone_number: Number,
  zip_code: Number,
  loc: {
    type: {
      type: String,
      default: "Point"
    },
    coordinates: []
  }
})
userSchema.index({
  'loc': '2dsphere'
});

module.exports = mongoose.model('user', userSchema, 'users')

файл маршрутов

const express = require('express')
const router = express.Router();
const mongoose = require('mongoose')
const jwt = require('jsonwebtoken')
const User = require('../models/user')
const db = 'mongodb+srv://georges:<1997>@cluster0-rm0vl.mongodb.net/users?retryWrites=true&w=majority'

mongoose.connect(db, {
  useNewUrlParser: true
}, (err) => {
  if (err) {
    console.log('The error is' + err)
  } else {
    console.log('the databasee is connected')
  }
})

router.get('/nearme/', (req, res) => {
  let queries = req.query;
  var distance = parseInt(req.query.maxDistance)
  var long = parseInt(req.query.long)
  var lat = parseInt(req.query.lat)
  User.find({
    loc: {
      $near: {
        $geometry: {
          type: "Point",
          coordinates: [long, lat]
        },
        $maxDistance: 10.5
      }
    }
  }, function(error, usernearme) {
    if (error) {
      res.status(401).send(error)
    } else {
      if (usernearme.length === 0) {
        res.status(401).send('no user near me')
      } else {
        res.status(200).send({
          usernearme
        })
      }
    }
  })
})

моя ошибка

{
  "operationTime": "6701513149272555521",
  "ok": 0,
  "errmsg": "error processing query: ns=users.usersTree: 
  GEONEAR field = loc maxdist = 10.5 isNearSphere = 0\ nSort: {}\
  nProj: {}\
  n planner returned error: unable to find index
  for $geoNear query ",
  "code": 2,
  "codeName": "BadValue",
  "$clusterTime": {
    "clusterTime": "6701513149272555521",
    "signature": {
      "hash": "tsfDSZp+cZIi6WDoULsy/NH+BQ0=",
      "keyId": "6696267117303431169"
    }
  },
  "name": "MongoError"
}

и, как вы можете видеть, индекс уже создан в файле схемы. Я получаю эту ошибку, как только передал в запрос значения долготы, широты и расстояния, чтобы вернуть пользователя рядом со мной. Любая помощь будет здорово, спасибо.

Автор: georges Источник Размещён: 12.06.2019 06:00

Ответы (1)


0 плюса

18 Репутация автора

Попробуйте изменить объект loc в схеме на допустимый объект Geojson. Как это:

loc {
  geometry: {
    type: { type: String, default: 'Point' } , 
    coordinates: {type: [Number] }
    } 
} 

Это связано с тем, что индекс 2dsphere ожидает допустимый объект Geojson. Тогда для выполнения запросов ваших объектов, вы можете использовать where()и within()функцию из мангуста, в соответствии с Документами .

Для справки смотрите эти два связанных вопроса: 1 и 2

Автор: philoez98 Размещён: 12.06.2019 07:51
Вопросы из категории :
32x32