Я создаю приложение, и у меня есть две модели.
const UserSchema = new Schema({
_id: Schema.Types.ObjectId,
account:{
type: String,
unique: true
},
email: String,
first_name: String,
last_name: String
}
const VenueSchema = new Schema({
_id: Schema.Types.ObjectId,
venue_type: String,
capacity: Number
})
и
const MediatorSchema = new Schema({
_id: Schema.Types.ObjectId,
account:{
type: String,
unique: true
},
user: {type: Schema.Types.ObjectId,
ref:'User'
}
venue: {type: Schema.Types.ObjectId,
ref:'Venue'
}
})
Схема посредника создается для заполнения нескольких путей.
Проблема в том, что когда я пытаюсь создать запрос вроде
var populateQuery = [{path:'user',match: { account:'testuser1'},select:'email'},{path:'venue',match: { venue_type: 'club'}, select:'venue_type'}];
const confirmedVenues = await Mediator.find({})
.exists('venue',true)
.populate(populateQuery)
.exec();
возвращаемый массив содержит объекты с нулевыми значениями, если соответствие не выполнено.
Например, когда я запрашиваю предыдущие совпадения, я получаю следующие результаты
Итак, я хочу, чтобы когда пользователь или место встречи или что-то было NULL (поэтому совпадение не выполняется), объект Whole не возвращался.
У меня есть следующее решение, но я не хочу этого делать
var i =confirmedVenues.length;
while(i--){
if (confirmedVenues[i].user == null){
temp.splice(i,1)
}
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Наконец, мне пришлось использовать здесь агрегацию, другого варианта нет.
Схемы менять не нужно
var results =await dbo.collection('mediators').aggregate([
{ $lookup:
{
from: 'venues',
localField: 'venue',
foreignField: '_id',
as: 'venue'
}
},
$match:{$and:[{"venue.venue_type":req.query.venue_type} , {"venue.capacity":{$gte:parseInt(req.query.capacitylb) , $lte:parseInt(req.query.capacityub)}}]}
},{
$lookup:
{
from: 'users',
localField: 'user',
foreignField: '_id',
as: 'user'
}
},{
$lookup:
{
from: 'professionals',
localField: 'professional',
foreignField: '_id',
as: 'professional'
}
},{
$lookup:
{
from:'availabilities',
localField: 'availability',
foreignField: '_id',
as: 'availability'
}
},{
$unwind: '$availability'
},{
$match:{$and:[{"availability.start":{$lte:new Date(req.query.dateFrom)}},{"availability.end":{$gte:new Date(req.query.dateTo)}}]}
},{
$lookup:
{
from:'locations',
localField: 'location',
foreignField: '_id',
as: 'location'
}
},{
$project:{
"_id":1,
"email":"$user.email",
"organization_name":"$user.organization_name",
"website":"$user.website",
"profile_pic_hash":"$user.profile_pic_hash",
"bio_hash":"$user.bio_hash",
"venue_type":"$venue.venue_type",
"capacity":"$venue.capacity",
"flat_fee":"$professional.flat_fee",
"per_participant_fee":"$professional.per_participant_fee",
"hourly_fee":"$professional.hourly_fee",
"start_date":"$availability.start",
"end_date":"$availability.end",
"distance":"$dist.calculated",
"location":"$location.location.coordinates",
"country":"$location.country",
"city":"$location.city",
"street":"$location.street",
"number":"$location.number",
"zip":"$location.zip"}}
Для меня это сработало идеально. Спасибо Энтони Винзлет за вашу помощь.
Здесь вы должны использовать агрегацию
$lookup... Других вариантов нет