У меня есть такая модель
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 });
})