пн go запрос $ почти всегда 0 результатов - PullRequest
1 голос
/ 22 марта 2020

Моя позиция поиска совпадает с позицией в базе данных. Результатом является пустой массив. Я ожидал получить один элемент из базы данных, потому что расстояние между обоими местоположениями равно 0.

Пн go Доку $ вблизи

Запрос, чтобы найти все ближайшие

Request.find({
            address: {
                location: {
                    $near: {
                        $geometry: {
                            type: 'Point' ,
                            coordinates: [8.4821159,49.4705199],
                        },
                        $maxDistance: 10000,
                        $minDistance: 0,
                    },
                },
            },
        })

Пн goose Модель

Редактировать (добавить): this.request.index ({'address.location': '2dsphere'});

  import mongoose from 'mongoose';

const ObjectId = mongoose.Schema.Types.ObjectId;
import {RequestMiddleware} from './RequestMiddleware';

class Request extends mongoose.Schema {
    public request: mongoose.Schema;

    constructor() {
        const RequestSchema = {
            title: {
                type: String,
                required: true,
            },
            description: {
                type: String,
                required: true,
            },
            category: {
                type: ObjectId,
                ref: 'Category',
                required: true,
            },
            created_by: {
                type: ObjectId,
                ref: 'User',
                required: true,
            },
            address: {
                location: {
                    type: {
                        type: String,
                        enum: ['Point'],
                        default: 'Point',
                        required: true,
                    },
                    coordinates: {
                        type: [Number],
                        default: [0, 0],
                        required: true,
                    },
                },
                plz: {
                    type: String,
                    required: false,
                },
                city: {
                    type: String,
                    required: false,
                },
                street: {
                    type: String,
                    required: false,
                },
                street_nr: {
                    type: String,
                    required: false,
                },
            },
            time_end: {
                type: Date,
                required: false,
            },
            confirmed_helper: {
                type: ObjectId,
                ref: 'User',
            },
            helper: [{
                helperId: {
                    type: ObjectId,
                    ref: 'User',
                },
                offer_text: {
                    type: String,
                },
            }],
        };
        const request = super(RequestSchema, {
            timestamps: {
                createdAt: 'created_at',
                updatedAt: 'updated_at',
            },
        });
        this.request = request;
        this.request.index({'address.location': '2dsphere'});
        this.request.plugin(RequestMiddleware);

        return this.request;
    }
}

export default mongoose.model('Request', new Request());

База данных:

database

1 Ответ

2 голосов
/ 22 марта 2020

Вам нужно две вещи:

2dspere index (возможно, у вас уже есть):

db.col.createIndex( { "address.location" : "2dsphere" } )

и изменить ваш запрос так, чтобы он использовал точку запись вместо вложенного объекта:

let result = await Request.find({
        'address.location': {
            $near: {
                $geometry: {
                    type: 'Point',
                    coordinates: [8.4821159, 49.4705199]
                },
                $maxDistance: 10000,
                $minDistance: 0
            }
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...