如何从猫鼬填充查询中排除空值 [英] How to exclude null values from Mongoose populate query
问题描述
我正在构建一个应用程序,并且创建了 2 个模型.
I am building an app and I have create 2 models.
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'
}
})
创建中介者模式是为了填充多个路径.
the mediator Schema is created in order to populate multiple paths .
问题是当我尝试创建像
The problem is that when i try to create a query like
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();
当匹配未完成时,返回的数组包含具有空值的对象.
the returned array contains objects with null values when the match is not fulfilled.
例如,当我查询以前的匹配时,我得到以下结果
For example when I query with the previous matches I get the following results
所以我想要的是,当用户或场地或其他东西为 NULL(因此匹配未完成)时,不返回 Whole 对象.
So what I want is , when a user or venue or something is NULL ( so the match is not fulfilled) , the Whole object not to be returned.
我得到了以下解决方案,但我不想这样做
I got the following solution but i dont want to do it this way
var i =confirmedVenues.length;
while(i--){
if(confirmedVenues[i].user == null){
temp.splice(i,1)
}
}
推荐答案
最后,我不得不在这里使用聚合,没有其他选择.
Finally , I had to use aggregation here , there are not other option .
模式不需要改变
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"}}
它对我来说很完美.感谢 Anthony Winzlet 的帮助.
It worked perfect for me. Thanks Anthony Winzlet for your help.
这篇关于如何从猫鼬填充查询中排除空值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!