Я ищу подходящую базу данных, поддерживающую поиск на основе местоположения, обнаружил, что MongoDB поддерживает Geo JSON Объекты.
Это приложение Store Locator, где пользователь может осмотреться и выбрать ближайший к нему магазин для заказа продуктов.
Простая схема поставщика:
const VendorSchema = new Schema({
address: {
type: String,
required: [true, 'Please add address']
},
formattedAddress: {
type: String
},
location: {
type: {
type: String,
enum: ['Point']
},
// GeoJSON Points
coordinates: {
type: [Number],
index: '2dsphere'
},
formattedAddress: String,
street: String,
city: String,
state: String,
zipcode: String,
country: String
},
createdAt: {
type: Date,
default: Date.now
}
});
В базе данных будет много товаров FMCG, которые могут продавать несколько поставщиков.
Схема продукта:
const ProductSchema = new Schema({
name: {
type: String,
required: true
},
desc: {
type: String,
required: true
},
price: Number,
createdAt: {
type: Date,
default: Date.now
}
});
Продавец может продавать несколько продуктов, и продукт может продаваться многими поставщиками, существует N-to-N
взаимосвязь между поставщиками и продуктами.
Итак, я думал о создании новой схемы, VendorProduct Schema:
const VendorProductSchema = new Schema({
price: Number,
discountVal: Number,
vendor : {
type: ObjectId,
ref: 'Vendor'
},
createdAt: {
type: Date,
default: Date.now
}
});
Вот где становится сложно / сложно:
Пользователи могут либо искать Продавца / Магазинов вокруг себя, либо могут напрямую искать Товар .
Если вас попросят найти Продавцов, он будет искать прямо в коллекции Продавцов с определенным радиусом.
Vendor.find({"location.coordinates": {$geoWithin: {$centerSphere: [[User long, User lat], 1/6378.15]}}})
Но когда пользователь ищет продукт:
Система должна отправить обратно найденные сведения о продукте (ах) вместе с ближайшими продавцами, которые их продают - от самого близкого до самого дальнего, в определенном радиусе.
По этой причине я думал о сохранении Geo JSON поставщика сведения о местоположении продукта в схеме VendorProduct.
VendorProduct Schema с Geo JSON подробности:
const VendorProductSchema = new Schema({
price: Number,
discountVal: Number,
vendor : {
type: ObjectId,
ref: 'Vendor'
},
location: {
type: {
type: String,
enum: ['Point']
},
// GeoJSON Points
coordinates: {
type: [Number],
index: '2dsphere'
}
},
createdAt: {
type: Date,
default: Date.now
}
});
Допустим, пользователь выполняет поиск с ключевым словом ONIONS. Он будет найден в коллекции продуктов, будет использовать ProductID и, в свою очередь, фильтровать их в коллекции VendorProducts на основе географических координат. Таким образом, я могу получить информацию о продукте, такую как описание, изображения из коллекции продуктов и поставщика, информацию о ценах из коллекции продуктов VendorProducts.
Это только помните, что один продукт может продаваться несколькими поставщиками. Когда пользователь выполняет поиск по названию продукта - может быть N продавцов этого продукта по разным ценам. Но чтобы найти только ближайших поставщиков, я думал о том, чтобы сохранить информацию о местоположении поставщика для продукта в VendorProductSchema.
НЕСКОЛЬКО ВОПРОСОВ:
- Правильно ли использовать MongoDB для такой вариант использования?
- Это правильный дизайн и подход?
- Какова временная сложность таких поисков географического местоположения в MongoDB?