2017-07-31 79 views
1

蒙戈排序的子文档我有一个成员集合:

{ 
    "_id": ObjectId("597cace8e68903af813c4fe8"), 
    "lastName": "Smith", 
    "firstName": "Lloyd", 
    "captain": ObjectId("597cace8e68903af813c4fe8") 
} 
{ 
    "_id": ObjectId("597cace8e68903af813c4fec"), 
    "lastName": "Jones", 
    "firstName": "Chris", 
    "captain": ObjectId("597cace8e68903af813c4fe8") 
} 

队长架构属性指的是同一个集合中的另一个文档。

我也有一个订单集合:

{ 
    "_id" : ObjectId("597cf7e165b6c3f5094080c9"), 
    "orderTotal" : 99.86, 
    "orderDate" : ISODate("2017-07-29T21:02:25.045Z"), 
    "orderProducts" : [ 
      { 
        "title" : "Beads", 
        "totalItemPrice" : 39.96 
      }, 
      { 
        "title" : "Doubloons", 
        "totalItemPrice" : 59.9 
      } 
    ], 
    "memberId" : ObjectId("597cace8e68903af813c4fec") 
} 

MEMBERID是指成员集的外键。

我正在准备一份如下所示的报告,并且由队长归类,按照升序排列队长的名字(姓氏,名字)。在队长群体,我想成员以同样的方式进行排序:

MEMBER ORDERS 

Captain: Lloyd Smith 

Members: 
    1. Chris Jones 
    * Beads: $39.96 
    * Doubloons: $59.90 
    * Total: $99.86 
    2. Lloyd Smith 
    * No Orders 
    etc.. 

Captain: George Taylor 

Members: 
    1. John Brown 
    * Beads: $1.96 
    * Doubloons: $9.00 
    * Total: $10.96 
    2. Chip Castle 
    * Beads: $1.00 
    * Doubloons: $9.00 
    * Total: $10.00 
    etc... 

我有一个查询,主要是我想要做什么,但它不成员名称排序:

Member.aggregate(
    { 
    $lookup : { 
     from : "orders", 
     localField : "_id", 
     foreignField : "memberId", 
     as : "tmpOrders" 
    } 
    }, 
    { 
    $lookup : { 
     from : "members", 
     localField : "captain", 
     foreignField : "_id", 
     as : "tmpCaptains" 
    } 
    }, 
    { 
    $group: { 
     _id: { 
     captain: "$captain", 
     captainFirstName: "$tmpCaptains.firstName", 
     captainLastName: "$tmpCaptains.lastName" 
     }, 
     members: { 
     $push: "$$ROOT" 
     } 
    } 
    }, 
    { 
    $project: { 
     "_id.captainFirstName": 1, 
     "_id.captainLastName": 1, 
     "members.firstName": 1, 
     "members.lastName": 1, 
     "members.tmpOrders.orderDate": 1, 
     "members.tmpOrders.orderTotal": 1, 
     "members.tmpOrders.orderProducts.title": 1, 
     "members.tmpOrders.orderProducts.totalItemPrice": 1 
    }, 
    }, 
    { 
    $sort: { 
     "_id.captainLastName": 1, 
     "_id.captainFirstName": 1 
    } 
    } 
) 

除了我的排序问题,我愿意提供任何建议,以改善我的管道可读性以及性能。

回答

0

我终于明白了!我需要$展开成员到$排序他们,再加上一些其他步骤将数据放回到所需的结构。

Member.aggregate([ 
    { 
     $lookup : { 
     from : "orders", 
     localField : "_id", 
     foreignField : "kreweOfTucksId", 
     as : "tmpOrders" 
     } 
    }, 
    { 
     $lookup : { 
     from : "members", 
     localField : "captain", 
     foreignField : "_id", 
     as : "tmpCaptain" 
     } 
    }, 
    { 
     $group: { 
      _id: "$captain", 
      captain: { 
       $addToSet: { 
        firstName: "$tmpCaptain.firstName", 
        lastName: "$tmpCaptain.lastName" 
       } 
      } 
      , 
      members: { 
       $addToSet: { 
        _id: "$_id", 
        firstName: "$firstName", 
        lastName: "$lastName", 
        captain: "$captain", 
        orders: "$tmpOrders", 

       } 
      } 
     } 
    }, 
    { 
     $unwind: "$members" 
    }, 
    { 
     $sort: { 
      "members.lastName": 1, 
      "members.firstName": 1 
     } 
    }, 
    { 
     $group: { 
      _id: "$captain", 
      members: { 
       $push: "$members" 
      } 
     } 
    }, 
    { 
     $sort: { 
      "_id.lastName": 1, 
      "_id.firstName": 1 
     } 
    }, 
    { 
     $project: { 
     _id: 1, 
     "members.firstName": 1, 
     "members.lastName": 1, 
     "members.orders.orderTotal": 1, 
     "members.orders.orderDate": 1, 
     "members.orders.orderProducts.title": 1, 
     "members.orders.orderProducts.totalItemPrice": 1 
     } 
    } 
]) 

鉴于生成此报告所需的步骤,我敢打赌有很多方法可以改进查询。如果有任何专家有改进建议,我将不胜感激。谢谢!