Mongoose:$lookup 后的 $project 不显示字段

Posted

技术标签:

【中文标题】Mongoose:$lookup 后的 $project 不显示字段【英文标题】:Mongoose: $project after $lookup don't show a field 【发布时间】:2019-05-07 07:21:39 【问题描述】:

我有两个模型 user.jsschedule.js 我有一个查询(聚合),我需要使用 $lookup 来“加入”这些模型.在 $lookup 之后,我使用 $project 选择我想在查询结果中显示的字段,但字段 scheduleStartscheduleEnd 不会显示在我的结果中。

User.js(模型)

  name: 
        type: String,
        required: true
    ,
    firstName: 
        String
    ,
    lastName: 
        String
    ,
    storeKey: 
        type: String,
        required: true
    ,
    avatar: String,
    birthday: String,
    phone: 
        type: String
    ,
    doc: String,
    email: 
        type: String
    ,...

Schedule.js(模型)

 service: 
    id: 
      type: String
    ,
    name: 
      type: String,
      required: true
    ,
    filters: [String]
  ,
  info: 
    channel: 
      type: String,
      required: true,
      default: 'app'
    ,
    id: String,
    name: String
  ,
  scheduleDate: 
    type: String,
    required: true
  ,
  scheduleStart: 
    type: String,
    required: true
  ,
  scheduleEnd: 
    type: String,
    required: true
  ,

我的查询

 User.aggregate([
      $match: 
        storeKey: req.body.store,     
      
    ,
    
      $group: 
        _id: 
          id: "$_id",
          name: "$name",
          cpf: "$cpf",      
          phone: "$phone",
          email: "$email",
          birthday: "$birthday",
          lastName: "$lastname"      
        ,
        totalServices: 
          $sum: "$services"
        ,    
      
    ,
    
      $lookup: 
        from: "schedules",
        localField: "_id.phone",
        foreignField: "customer.phone",
        as: "user_detail"
        
    ,  
    
      $project: 
        _id: 1,
        name: 1,
        name: 1,
        cpf: 1,      
        phone: 1,
        email: 1,
        birthday: 1,
        totalServices: 1,
        totalValue:  "$sum": "$user_detail.value" ,
        scheduleStart: 1,
        scheduleEnd: 1,
        count: 
          $sum: 1
        
      
       
  ])...

我的查询结果:

count: 1
totalServices: 89
totalValue: 2374
_id:
birthday: "1964-03-18",
cpf: "319335828",
email: "jdoe@gmail.com.br",
id: "5b1b1dcce1ab2a8eb580f",
name: "Jonh Doe",
phone: "11996370565"

【问题讨论】:

scheduleStart 是来自schedules 集合的字段。而您的$lookup 详细信息在user_details 内。所以将user_details 放在$project 阶段。 我该怎么做? 试试这个 $project: _id: 1, name: 1, name: 1, cpf: 1, phone: 1, email: 1, birthday: 1, totalServices: 1, totalValue: "$sum": "$user_detail.value" , count: $sum: 1 , user_detail: 1 我可以只把scheduleStartscheduleEnd 带入那个$project 中的user_detail 吗? 【参考方案1】:

您可以在$project 阶段下方使用$arrayElemAt 聚合

 '$project': 
  '_id': 1,
  'name': 1,
  'cpf': 1,      
  'phone': 1,
  'email': 1,
  'birthday': 1,
  'totalServices': 1,
  'totalValue':  '$sum': '$user_detail.value' ,
  'scheduleStart':  '$arrayElemAt': ['$user_detail.scheduleStart', 0] ,
  'scheduleEnd':  '$arrayElemAt': ['$user_detail.scheduleEnd', 0] ,
  'count':  '$sum': 1 
 

【讨论】:

以上是关于Mongoose:$lookup 后的 $project 不显示字段的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose $lookup 聚合没有按预期工作

Mongoose.aggregate(pipeline) 使用 $unwind、$lookup、$group 链接多个集合

MongoDB mongoose $lookup 不在数组中。

来自多个集合的 $lookup 的 Mongoose 聚合返回空集

合并嵌套在数组 mongoose 中的对象内的 $lookup 值

如何访问 mongoose $aggregate->$lookup-> pipeline->$match 中的字段名称