как получить доступ к $ geowithin после заполнения

#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 , но все равно получаю тот же пустой массив