Застрял с MongoDB, пропускающим $ lookup

#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