Получить документы на основе условного запроса полей в mongoose js - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть такая модель

const schema = new mongoose.Schema({
  locationtype: String,        // one of "all","locationstoshow","locationsnottoshow"
  locations: [{
    location_country: String,
    location_state: String,
    location_city: String
  }]
});

export default mongoose.model("AdPost", schema);

Теперь у меня есть значения страна, штат и город текущего пользователя.Я хочу получить те документы adposts, которые удовлетворяют этим условиям -

, если locationtype - "all", тогда должны быть возвращены все документы,

, если locationtype - "locationtoshow", тогда каждый документ долженпроверить, разрешены ли текущая страна пользователя, штат и город.если да, они должны быть возвращены.в противном случае - нет.

, если locationtype - это «locationnottoshow», то каждый документ должен быть проверен, не указано ли местоположение пользователя в местоположениях, и вернуть его.в противном случае - нет.

Обратите внимание, что если город не упоминается (например, location_city: ""), а штат и страна упоминаются в местоположениях, то проверяются страна и штат пользователя. И если указана только страна, а также город и штат и "",затем сопоставляется страна пользователя.

Я думаю, что-то вроде этого, но это не дает правильный результат.

let query = [{
        "$cond": {
            "if": {
                "$eq": [ "locationtype", "all" ]
            },
            "then": {
                "$match": [{
                    "$cond": {
                        "if": {
                            "$neq": [ "locations.location_city", "" ]
                        },
                        "then": {
                            "$neq": [ "locations.location_city", "" ]
                        },
                        "else": {
                            "if": {
                                "$neq": [ "locations.location_state", "" ]
                            },
                            "then": {
                                "$eq": [ "locations.location_state", "" ]
                            },
                            "else": {
                                "$eq": [ "locations.location_country", "" ]
                            }
                        }
                    }
                }]
            },
            "else": {
                "if": {
                    "$eq": [ "locationtype", "locationstoshow" ]
                },
                "then": {
                    "$match": [{
                        "$cond": {
                            "if": {
                                "$neq": [ "locations.location_city", "" ]
                            },
                            "then": {
                                "$eq": [ "locations.location_city", `${city}` ]
                            },
                            "else": {
                                "if": {
                                    "$neq": [ "locations.location_state", "" ]
                                },
                                "then": {
                                    "$eq": [ "locations.location_state", `${state}` ]
                                },
                                "else": {
                                    "$eq": [ "locations.location_country", `${country}` ]
                                }
                            }
                        }
                    }]
                },
                "else": {
                    "if": {
                        "$eq": [ "locationtype", "locationsnottoshow" ]
                    },
                    "then": {
                        "$match": [{
                            "$cond": {
                                "if": {
                                    "$neq": [ "locations.location_city", "" ]
                                },
                                "then": {
                                    "$neq": [ "locations.location_city", `${city}` ]
                                },
                                "else": {
                                    "if": {
                                        "$neq": [ "locations.location_state", "" ]
                                    },
                                    "then": {
                                        "$neq": [ "locations.location_state", `${state}` ]
                                    },
                                    "else": {
                                        "$neq": [ "locations.location_country", `${country}` ]
                                    }
                                }
                            }
                        }]
                    },  
                }
            }
        }
    }];

const options = {
    limit: 10,
    page: pageNo
}

AdPost.aggregatePaginate(query, options).then(docs => {
    res.json({ docs });
}).catch(err => {
    res.status(400).json({ errors: err });
})
...