>

2 개의 컬렉션 사용자와 주문이 있습니다. 기본 정보를 수집하고 싶습니다 username, user collection의 firstname 및 주문 테이블의 금액 합계와 같습니다. 사용자 콜렉션에서 정보를 가져오고 주문 ​​콜렉션을 반복하여 데이터를 선택할 수 있습니다. 페이지 매김도 작동하지만 정렬을 구현하는 방법. 주문 수집에서 금액 합계에 대한 정렬을 적용하는 방법. 내 코드는 아래와 같습니다

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

내 질문은 금액 합계를 사용하여 정렬하는 방법입니까?

예상되는 출력 detsil :

위의 스크린 샷에서 모든 열과 _id, 이메일 주소, 이름, 성은 사용자 컬렉션에서 정렬하고 제출 및 소비 한 금액은 주문 컬렉션에서 정렬하고 싶습니다. 또한 주문 수집에서 소비 된 금액과 제출 금액은 필드의 합계입니다. 그렇다면 모든 열을 사용하여 정렬하는 방법은 무엇입니까?


  • 답변 # 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 }} 를 사용하십시오

관련 자료

  • 이전 소수점 이하 2 자리의 토큰에 대해 web3js에서 toWei () 함수를 사용하는 방법은 무엇입니까?
  • 다음 multithreading - Java의 스레드가 최종 필드를 캐시 할 수 있습니까?