#node.js #mongodb #express #mongoose
#node.js #mongodb #выразить #мангуст
Вопрос:
[
{ $match: query },
{ $sort: { createdAt: -1 } },
{
$lookup: {
from: 'users',
let: { coordinatess: "$geoPoints.coordinates" },
pipeline: [
{
$match: {
"location.coordinates": {
"$geoWithin": {
"$geometry": {
"type": "Polygon",
"coordinates": "$$coordinatess"
}
}
}
}
}
],
as: "users"
}
}
]
Я застрял здесь, как использовать координаты, определенные на этапе let lookup, в координатах на этапе $ match конвейера. Я использую NodeJS, mongoose, mongo и express.
Коллекция, к которой применяется агрегирование
let geoFencingSchema = mongoose.Schema({
locationPoints: [],
geoPoints: {
type: { type: String },
coordinates: { type: Array }
},
name: { type: String },
}
Эта схема имеет объект GeoPoints с типом polygon
Коллекция поиска: пользователь
let userSchema = new Schema({
firstName: {
type: String,
// required: true
},
lastName: {
type: String,
// required: true
},
lastName: {
type: String,
// required: true
},
gender: String,
address: String,
bio: String,
dob: Number,
userName: String,
referralCode: String,
referredCount: Number,
referingCode: String,
email: {
type: String,
lowercase: true
},
countryCode: {
type: String
},
phone: {
type: String
},
wallet: {
type: Number,
default: 0,
select: false
},
profilePic: {
type: String,
default: ''
},
provider: {
type: String,
default: '',
},
providerId: {
type: String,
default: '',
},
instagram: {
type: String,
default: '',
},
profileStatus: {
type: Number,
default: 0
},
level: {
type: Number,
default: 0,
enum: [1, 0]
},
deviceId: {
type: String,
select: false
},
deviceType: {
type: String,
select: false
},
authToken: {
type: String,
select: false
},
sendNoti: {
type: Number,
default: 1,
select: false
},
date: {
type: Number,
select: false
},
status: {
type: Number,
default: 1,
select: false
},
isEmailVerified: {
type: Boolean,
default: false
},
isPhoneVerified: {
type: Boolean,
default: false
},
isSocialRegister: {
type: Boolean,
default: false
},
isDeleted: {
type: Boolean,
default: false
},
roles: {
type: String,
default: 'user',
enum: ['user', 'admin']
},
password: { type: String, select: false },
resetPasswordToken: {
type: String,
required: false
},
resetPasswordExpires: {
type: Date,
required: false
},
latitude: Number,
longitude: Number,
location: {
type: { type: String, default: 'Point' },
coordinates: {
type: Array,
default: [0, 0]
}
}
}
Пользовательская схема имеет местоположение с типом point
Данные схемы геозоны
{
"_id" : ObjectId("5f48dd851610637b1c7f3c61"),
"locationPoints" : [
{
"lat" : 30.77136354975902,
"lng" : 76.74319977306477
},
{
"lat" : 30.76811862371129,
"lng" : 76.83212036632649
},
{
"lat" : 30.71559461433081,
"lng" : 76.79813141368977
},
{
"lat" : 30.727695379373678,
"lng" : 76.73290009044759
},
{
"lat" : 30.77136354975902,
"lng" : 76.74319977306477
},
{
"lat" : 30.77136354975902,
"lng" : 76.74319977306477
}
],
"name" : "Delhi",
"geoPoints" : {
"type" : "Polygon",
"coordinates" : [
[
[
76.74319977306477,
30.77136354975902
],
[
76.83212036632649,
30.76811862371129
],
[
76.79813141368977,
30.71559461433081
],
[
76.73290009044759,
30.727695379373678
],
[
76.74319977306477,
30.77136354975902
],
[
76.74319977306477,
30.77136354975902
],
[
76.74319977306477,
30.77136354975902
]
]
]
},
"createdAt" : ISODate("2020-08-28T16:03:41.514 05:30"),
"updatedAt" : ISODate("2020-08-28T16:03:57.644 05:30"),
"__v" : 0
}
Объект местоположения пользовательской схемы
"location" : {
"type" : "Point",
"coordinates" : [
76.7533104,
30.732036
]
},
Комментарии:
1. используйте внутренний поиск
"coordinates": "$$coordinatess"
вместо"coordinates": "$geoPoints.coordinates"
2. также пробовал это, но внутри $ match мы должны использовать $ expr и смущены тем, как его использовать.
3. почему бы вам не опубликовать некоторые образцы данных
4. Готовые данные отправлены @varman