Mongodb: запрос документов по полю вложенного документа (GeoJSON) - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть три схемы документа в моей модели базы данных: pointSchema (просто определение точки GeoJSON), PlaceSchema (это реальное место, как ночной клуб) и EventSchema (в нем будут храниться данные, связанные с такими событиями, как вечеринки и фестивали).

Но у меня есть некоторые проблемы.Мне нужно запросить документы событий в соответствии с его местоположением, но эти данные о местоположении хранятся в поддокументе, который связан с событием.

Ниже приведены определения моей схемы:

const pointSchema = new mongoose.Schema({
  type: {
    type: String,
    enum: ['Point'],
    required: true
  },
  coordinates: {
    type: [Number],
    required: true
  }
});

const PlaceSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: true
    },
    location: {
      type: pointSchema,
      required: true
    }
  },
  {
    versionKey: false,
    timestamps: true
  }
);
PlaceSchema.index({
  name: 'text',
  location: "2dsphere"
});

const EventSchema = new mongoose.Schema(
  {
    name: {
      type: String,
      required: true
    },
    place: {
      type: mongoose.SchemaTypes.ObjectId,
      ref: 'Place'
    }
  },
  {
    versionKey: false,
    timestamps: true
  }
)
EventSchema.index({
  name: 'text'
})

Я могу фильтровать документы Places, используя что-то вроде этого:

db.Places.find({ 
    location: {
        $geoWithin: { 
            $centerSphere: [ 
                [ -28.824342, -49.218433 ],
                100 / 6378.1 
            ] 
        } 
    }
})

Но я не могу сделать то же самое, когда пытаюсь отфильтровать события.Я уже пробовал запрос, подобный этому:

db.Events.find({ 
    "place.location": {
        $geoWithin: { 
            $centerSphere: [ 
                [ -28.824342, -49.218433 ],
                100 / 6378.1 
            ] 
        } 
    }
})

, но это решение не работает.Кто-нибудь может мне помочь?

Спасибо.

1 Ответ

0 голосов
/ 18 февраля 2019

Поскольку place в вашем event документе является просто ObjectId, у вас есть один из 2 вариантов

  1. несколько находок
let places = db.Places.find({ 
   location: {
       $geoWithin: { 
           $centerSphere: [ 
               [ -28.824342, -49.218433 ],
               100 / 6378.1 
           ] 
       } 
   }
}, { _id:1 }) // get the places _ids

let events = db.events.find({
   place: { $in: places.map(p => p._id) }
}) // get events that has the places _ids

агрегация
const stages = [
{ $geoNear: {
   near: { type: "Point", coordinates: [ -28.824342, -49.218433 ] },
   distanceField: "distance",
   spherical: true,
   maxDistance: 100 / 6378.1
} },
{ $lookup: {
   from: 'events',
   localField: '_id',
   foreignField: 'place',
   as: 'events'
} }
];

let result = db.places.aggregate(stages);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...