Mongoose: $ project после $ lookup не показывает поле - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть две модели user.js и schedule.js , и у меня есть запрос (совокупный), который мне нужно использовать $ lookup для "соединенияэти модели.После $ lookup я использую $ project , который выбирает поля, которые я хочу показать в результате моего запроса, но поля scheduleStart и scheduleEnd не отображаются в моем результате.

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"
}

1 Ответ

0 голосов
/ 05 декабря 2018

Вы можете использовать ниже $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 }
}} 
...