Как запросить реляционный документ в пн goose? - PullRequest
1 голос
/ 22 марта 2020

Есть две коллекции.

Коллекция - ОпубликованоBy

{
    _id: "2461177814122722",
    name : "Nur"
    location: {
        type: "Point",
        coordinates: [ 90.341044,  23.787105 ]
    }
}

Коллекция - Сообщений

{
    _id: "5e7447336da7300a1cb64c51",
    model: asus,
    postedBy : "2461177814122722",
    price : 1255   
}

Как я могу сделать запрос таким образом?

posts.find({
  postedBy: {
    location: {
      $near: [-74, 40],
      $maxDistance: 10
    }
  }
});

Я хочу сделать запрос по этому документу ниже. Но как я могу запросить реляционный документ в пн goose?

{
  _id: "5e7447336da7300a1cb64c51",
  model: asus,
  postedBy: {
    name: "Nur",
    location: {
      type: "Point",
      coordinates: [90.341044, 23.787105]
    }
  },
  price: 1255
};

1 Ответ

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

Сначала вы должны создать двумерный индекс:

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

Затем вы можете запустить агрегирование следующим образом:

db.PostedBy.aggregate([
   {
      $geoNear: {
         near: {
            type: "Point",
            coordinates: [-74, 40]
         },
         distanceField: "distance",
         //maxDistance: 20000, // max. Distance in Meters
         spherical: true
      }
   },
   {
      $lookup:
         {
            from: "posts",
            localField: "_id",
            foreignField: "postedBy",
            as: "posts"
         }
   },
   {
      $project: {
         model: "$posts.model",
         price: "$posts.price",
         postedBy: { name: "$name", location: "$location" }
      }
   }
])

Примечание, [-74, 40] до [90.341044, 23.787105] больше чем 10 000 км, проверьте введенные значения.

Значения price и model возвращаются в виде массива, поскольку у вас может быть более одного поста для каждого «PostedBy». Если вы хотите получить один элемент, добавьте { $set: { model: { $arrayElemAt: ["$model", 0] } } } или { $unwind: "$model" }, соответственно. price

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...