Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

$project in $lookup mongodb

Tags:

I have a query, that use $lookup to "join" two models, after this i use $project to select olny the fields that i need, but my $project brings an arrray of objects (user_detail) that contains more data that i need. I want only two fields (scheduleStart and scheduleEnd) of my result.

My query:

 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" },         count: {           $sum: 1         },         user_detail: 1       }     }, 

Result of query:

count: 1 totalServices: 0 totalValue: 73 user_detail: Array(2) 0: ... paymentMethod: 0 paymentValue: "0" scheduleDate: "2018-10-02" scheduleEnd: "2018-10-02 08:40" scheduleStart: "2018-10-02 08:20" status: 3 store: "5b16cceb56a44e2f6cd0324b" updated: "2018-11-27T13:30:21.116Z" 1: ... paymentMethod: 0 paymentValue: "0" scheduleDate: "2018-11-27" scheduleEnd: "2018-11-27 00:13" scheduleStart: "2018-11-27 00:03" status: 2 store: "5b16cceb56a44e2f6cd0324b" updated: "2018-11-27T19:33:39.498Z" _id: birthday: "1992-03-06" email: "[email protected]" id: "5bfed8bd70de7a383855f09e" name: "Chris Santos G" phone: "11969109995" ... 

Result that i need:

count: 1 totalServices: 0 totalValue: 73 user_detail: Array(2) 0: scheduleEnd: "2018-10-02 08:40" scheduleStart: "2018-10-02 08:20" 1: scheduleEnd: "2018-11-27 00:13" scheduleStart: "2018-11-27 00:03"  _id: birthday: "1992-03-06" email: "[email protected]" id: "5bfed8bd70de7a383855f09e" name: "Chris Santos G" phone: "11969109995" ... 

How can i do this with my query?

like image 603
Matheus Barem Avatar asked Dec 10 '18 16:12

Matheus Barem


People also ask

What does $project do in MongoDB?

The $project takes a document that can specify the inclusion of fields, the suppression of the _id field, the addition of new fields, and the resetting of the values of existing fields. Alternatively, you may specify the exclusion of fields. Specifies the inclusion of a field.

What is $lookup in MongoDB?

$lookup performs an equality match on the localField to the foreignField from the documents of the from collection. If an input document does not contain the localField , the $lookup treats the field as having a value of null for matching purposes.

Can we join 2 collections in MongoDB?

For performing MongoDB Join two collections, you must use the $lookup operator. It is defined as a stage that executes a left outer join with another collection and aids in filtering data from joined documents.

What is difference between $Group and $project in MongoDB?

$group is used to group input documents by the specified _id expression and for each distinct grouping, outputs a document. $project is used to pass along the documents with the requested fields to the next stage in the pipeline.


1 Answers

You can use $lookup 3.6 syntax to $project the fields inside the $lookup pipeline

User.aggregate([   { "$lookup": {     "from": "schedules",     "let": { "id": "$_id.phone" },     "pipeline": [       { "$match": { "$expr": { "$eq": ["$customer.phone", "$$id"] }}},       { "$project": { "scheduleStart": 1, "scheduleEnd": 1 }}     ],     "as": "user_detail"   }} ]) 
like image 52
Ashh Avatar answered Nov 09 '22 04:11

Ashh