Nathan Power
Nathan Power

Reputation: 650

MongoDB aggregate() .$unwind

I have some data that looks like this (not real data):

 {
      _id:'cust04',
      name:'Diarmuid Rellis',
      address:'Elysium, Passage East',
      county:'Waterford',
      phone:'051-345786',
      email:'[email protected]',
      quotations:[
         {
            _id:'quot03',
            supplier_ref:'A2006',
            date_received: new Date('2013-05-12T00:00:00'),
            date_returned: new Date('2013-05-15T00:00:00'),
            supplier_price:35000.00,
            customer_price:35000.00,
            orders:[
               {
                  _id:'ord03',
                  order_date: new Date('2013-05-20T00:00:00'),
                  del_date: new Date('2013-08-12T00:00:00'),
                  del_address:'Elysium, Passage East, Co. Waterford',
                  status:'BALPAID'
               }
            ]
         },
         {
            _id:'quot04',
            supplier_ref:'A2007',
            date_received: new Date('2013-08-10T00:00:00'),
            date_returned: new Date('2013-08-12T00:00:00'),
            supplier_price:29600.00,
            customer_price:29600.00,
            orders:[
               {
                  _id:'ord04',
                  order_date: new Date('2014-03-20T00:00:00'),
                  del_date: new Date('2014-05-12T00:00:00'),
                  del_address:'Elysium, Passage East, Co. Waterford',
                  status:'INPROD'
               }
            ]
         }
      ]
   }

I am trying to unwind the quotations and orders arrays, and get a projection of all orders in production which include the customer name, supplier_ref and order date for each.

Here is my query:

 db.customers.aggregate([
    { $unwind: "$quotations" },
    { $unwind: "$quotations.orders" },
    { $match: { 'quotations.orders.status': 'INPROD' } },
    {
    $project: {
        name: 1,
            supplier_ref: "$quotations.supplier_ref",
            order_id: "$quotations.orders._id",
            order_date: "$quotations.orders.order_date"
            }     
    },
    {
        $group: {
            _id: "$order_id"
        }

    }
], function (err, results) {
console.log(results);
})

The query runs successfully, but just gives the order ids, not any of the other fields required. What am I missing ?

EDIT

I am hoping for a result like:

 "result": [
  {
    "_id" : "orderid01",
    "name" : "Joe Bloggs",
     "supplier_ref" : "A1234",
     "date_ordered" : "2012-04-14"
  },
  {
    "_id" : "orderid02",
    "name" : "Joe Bloggs",
     "supplier_ref" : "A1235",
     "date_ordered" : "2012-04-16"
  }
]

When I add an extra field to my 'group' function, like so:

    $group: {
        _id: "$order_id", 
        supplier_ref: "$supplier_ref"

    }

I get the error: "the group aggregate field 'supplier_ref' must be defined as an expression inside an object". Do I have to associate it with the result object in some way ?

Upvotes: 0

Views: 480

Answers (1)

Nathan Power
Nathan Power

Reputation: 650

Removing the group function altogether produced the results I wanted.

Upvotes: 1

Related Questions