在mongodb和php中将2个集合数据与排序和分页结合起来

时间:2018-11-27 11:03:41

标签: php mongodb mongodb-query aggregation-framework

我有2个收藏用户和订单。我想收集基本信息 如用户名,用户集合中的名字和订单表中金额的总和。我可以通过从用户集合中获取信息并遍历订单集合来选择数据。分页也可以,但是如何实现分页。如何对订单收集中的金额总和进行排序。我的代码在下面给出

$cursor = $collection->find($where)->sort($order)->skip($page)->limit($perPage);
    foreach ($cursor as $key => $value) {
        $orderCollection = $this->db->selectCollection('orders');
        $userSubmissions =  $orderCollection->aggregate([
                                ['$match' => ['user_id' => $value['_id'], 'txn_type' => 'DR']],    
                                ['$group' => ['_id' => null, 'debit' => ['$sum' => '$amount']]],
                                ['$sort'  => $order]
                            ]);}

我的收藏也是

用户集合

{
"_id" : ObjectId("59f0546ef2a608770e8b4569"),
"firstname" : "test",
"username" : "test@test.com",
"lastname" : "test",
"status" : NumberLong(1),
"admin" : NumberLong(1),
"created_at" : ISODate("2018-04-02T06:46:53.702Z")}

订单收集

{
"_id" : ObjectId("5aaa49d0f2a60838218b4568"),
"user_id" : ObjectId("59f0546ef2a608770e8b4569"),
"txn_type" : "DR",
"name" : "Test Test",
"amount" : 11.85,
"created" : ISODate("2018-03-15T10:24:16.634Z")}

所以我的问题是如何使用金额总和进行排序?

预期的输出细节:

enter image description here

在上面的屏幕截图中,我想对所有列进行排序,并且_id,电子邮件地址,名字,姓氏来自用户集合,并且提交和花费金额来自订单集合。同样,提交和订单收集所花费的金额也是字段总和。那么如何使用所有的列进行排序?

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

db.users.aggregate([
  { "$match": { "_id": ObjectId("59f0546ef2a608770e8b4569") }},
  { "$lookup": {
    "from": "orders",
    "localField": "_id",
    "foreignField": "user_id",
    "as": "orders"
  }},
  { "$unwind": "$orders" },
  { "$group": {
    "_id": "$orders.user_id",
    "debit": { "$sum": "$orders.amount" },
    "firstname": { "$first": "$firstname" },
    "lastname": { "$first": "$lastname" },
    "email": { "$first": "$username" }
  }}
])

您可以对以上聚合中的任何字段使用$sort。只需使用{ $sort: { fieldName: 1 }}