#node.js #mongodb #express #mongoose
#node.js #mongodb #экспресс #mongoose
Вопрос:
это данные продавца
{
"orderStatus": "active",
"_id": "5f364413bb0786070d467eee",
"userid": {
"usertype": "seller",
"_id": "5f36095b2046a5034afdaa71",
"name": "chinnu",
"email": "chinnu@gmail.com",
"phonenumber": "9618222516",
"__v": 0
},
"address": {
"location": {
"coordinates": [
78.44785,
17.84677
],
"type": "Point",
"city": "Toopran"
},
"_id": "5f360a142046a5034afdaa72",
"userid": "5f36095b2046a5034afdaa71",
"hno": "7-3/1",
"village": "toopran",
"street": "near gandhi statue",
"mandal": "toopran",
"district": "medak",
"state": "telangana",
"pincode": "502334",
"__v": 0
},
"postedDate": "14/08/2020",
"__v": 0
}
итак, я (покупатель) хочу заполнить, и я хочу получить доступ к объекту location в адресной строке и получить пользователей в диапазоне 100 км, но я получаю пустой массив.
Я могу получить доступ к ранжированным пользователям, если таблица содержит свойство прямого местоположения с указанием долготы и широты.
app.get("/", async (req, res) => {
try {
const lat = req.query.latitude;
const lon = req.query.longitude;
const radius = 100 / 6378;
// console.log(radius)
const foundUsers = await sellerData
.find({
orderStatus: "active",
location: {
$geoWithin: { $centerSphere: [[78.363151, 17.912214], radius] },
},
})
.populate([
{
path: "userid",
model: "seller_user_table",
select: "-soldHistory",
},
{ path: "address", model: "address" },
]);
res.status(200).json(foundUsers)
} catch (error) {
res.status(500).json({ success : false , error : error.message })
}
});
это схема
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const seller_table_data_schema = Schema({
userid: {
type: Schema.Types.ObjectId,
ref: "seller_user_table",
required: true,
},
image: {
type: String,
required: true,
},
scarpType : {
type : String,
required : true
},
address: {
type: Schema.Types.ObjectId,
ref: "address",
required: true,
},
postedDate: {
type: String,
required: true,
},
orderStatus: {
type: String,
default: "active",
},
});
const seller_table_data = mongoose.model("seller_table_data", seller_table_data_schema);
module.exports = seller_table_data;
Это схема адресов :
const mongoose = require('mongoose')
const geocoder = require('../utils/geocoder')
const Schema = mongoose.Schema;
const address_Schema = Schema({
userid : {
type : Schema.Types.ObjectId,
ref: 'seller_user_table'
},
hno : {
type : String,
required : true
},
village : {
type : String,
required : true
},
street : {
type : String,
required : true
},
mandal : {
type : String,
required : true
},
district : {
type : String,
required : true
},
state : {
type : String,
required : true
},
pincode : {
type : String,
required : true
},
location : {
type : {
type : String
},
coordinates : {
type : [Number]
},
city : String
}
})
address_Schema.pre('save',async function(next){
const address_data = `${this.hno},${this.village},${this.mandal},${this.district},${this.state},${this.pincode}`;
const loc = await geocoder.geocode(address_data)
console.log(loc)
this.location = {
type : 'Point',
coordinates : [loc[0].longitude,loc[0].latitude],
city : loc[0].city
};
next()
})
const address = mongoose.model("address", address_Schema);
module.exports = address;
Комментарии:
1. не могли бы вы помочь, как это сделать с моим кодом, пожалуйста
2. я уже пробовал этот «address.location»: { также это не работает
3. ok проверит, возможно ли с помощью populate или нет, в противном случае вам нужно перейти к aggregate(), обновит вас.
4. можете ли вы добавить свои схемы в свой вопрос..
5. братан, проверь, добавил ли я схему
Ответ №1:
Я не уверен, что это возможно с помощью метода populate или нет, но вы можете попробовать aggregate(),
const radius = 100 / 6378;
const foundUsers = await sellerData.aggregate([
// Match conditions
{ $match: { orderStatus: "active" } },
// Join with 'seller_user_table' collection
{
$lookup: {
from: "seller_user_table",
localField: "userid",
foreignField: "_id",
as: "userid"
}
},
// deconstruct userId because by default lookup will return an array
{ $unwind: { path: "$userid" } },
// join address collection
{
$lookup: {
from: "address",
localField: "address",
foreignField: "_id",
as: "address"
}
},
// deconstruct address because by default lookup will return an array
{ $unwind: { path: "$address" } },
// match condition for address location
{
$match: {
"address.location": {
$geoWithin: {
$centerSphere: [
[78.363151, 17.912214],
radius
]
}
}
}
}
])
Комментарии:
1. Братан, не повезло, тот же результат, я получаю проверку пустого массива, я также добавил схему адресов в вопрос
2. вы проверяли ссылку на игровую площадку, это нормально? почему это работает?
3. в разделе playground это работает, но в моем коде это не работает, выдавая пустой массив
4. можете ли вы попробовать изменить номер radius и попытаться выполнить после удаления последнего конвейера
$match
, дайте мне знать, что произойдет5. я удалил
$match
, но все равно получаю тот же пустой массив