如何从 Mongoose 填充查询中排除空值

Posted

技术标签:

【中文标题】如何从 Mongoose 填充查询中排除空值【英文标题】:How to exclude null values from Mongoose populate query 【发布时间】:2019-02-08 12:48:01 【问题描述】:

我正在构建一个应用程序,我已经创建了 2 个模型。

  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)
  

【问题讨论】:

你必须在这里使用$lookup聚合...没有其他选项 【参考方案1】:

最后,我不得不在这里使用聚合,没有其他选择。

架构不需要更改

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 的帮助。

【讨论】:

以上是关于如何从 Mongoose 填充查询中排除空值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoose 排序结束时保持空值? [复制]

如何有条件地在 Mongoose 的查询中包含/排除字段?

根据另一个字段值 mongodb mongoose 从文档中排除字段

在 ms 访问中排除空值的选择查询是啥

如何在 Express 和 Mongoose 的一个控制器 API 内发出多个“查找”请求?

如何使 .populate 排除空值?