2016-11-01 4 views
0

은 내가 여러 컬렉션이 지금은 Users.items 채울MongoDB를 집계 및 그룹화 중첩 된 객체

db.Users.aggregate(
    [ 
     { 
      $match: { 
       _id: ObjectId("n") 
      } 
     }, { 
      $unwind: "$items" 
     }, { 
      $lookup: { 
       from: "Items", 
       localField: "items", 
       foreignField: "_id", 
       as: "items" 
      } 
     }, { 
      $unwind: "$items" 
     }, { 
      $group: { 
       _id: "$_id", 
       items: { $push: "$items" } 
      } 
     } 
    ] 
) 

을하지만 난 다룰 수 없다 항목 내부의 카테고리. 나는 아래의 코드를 사용하여 카테고리를 얻는다.

db.Users.aggregate(
    [ 
     { 
      $match: { 
       _id: ObjectId("n") 
      } 
     }, { 
      $unwind: "$items" 
     }, { 
      $lookup: { 
       from: "Items", 
       localField: "items", 
       foreignField: "_id", 
       as: "items" 
      } 
     }, { 
      $unwind: "$items" 
     }, { 
      $unwind: "$items.categories" 
     }, { 
      $lookup: { 
       from: "Categories", 
       localField: "items.categories", 
       foreignField: "_id", 
       as: "items.categories" 
      } 
     }, { 
      $group: { 
       _id: "$_id", 
       items: { $push: "$items" } 
      } 
     } 
    ] 
) 

하지만 올바른 그룹화를 수행 할 수 없습니다.

항목 내에서 카테고리를 올바르게 그룹화하는 방법에 대한 아이디어가 있으십니까?

답변

1

나는 지금까지 궤도에 진입했다고 생각합니다. 이제 구조체를 병합하기 위해 중첩 된 그룹화를 수행하면됩니다. 결국 두 그룹이 필요합니다. 먼저 사용자 ID 및 항목 ID별로 그룹화하고 고유 사용자 항목을 카테고리 및 최종 사용자 그룹별로 사용자 ID별로 밀어 넣고 해당 카테고리로 항목을 푸시합니다.

db.User.aggregate(
    [{ 
     $match: { 
      _id: 123 
     } 
    }, { 
     $unwind: "$items" 
    }, { 
     $lookup: { 
      from: "Items", 
      localField: "items", 
      foreignField: "_id", 
      as: "userItems" 
     } 
    }, { 
     $unwind: "$userItems" 
    }, { 
     $unwind: "$userItems.categories" 
    }, { 
     $lookup: { 
      from: "Categories", 
      localField: "userItems.categories", 
      foreignField: "_id", 
      as: "categoryItems" 
     } 
    }, { 
     $group: { 
      _id: { 
       id: "$_id", 
       itemId: "$userItems._id" 
      }, 
      items: { 
       $addToSet: "$items" 
      }, 
      categories: { 
       $push: "$categoryItems" 
      } 
     } 
    }, { 
     $group: { 
      _id: "$_id.id", 
      itemCategories: { 
       $push: { 
        items: "$items", 
        categories: "$categories" 
       } 
      } 
     } 
    }] 
); 

샘플 출력 :

{ 
    "_id": 123, 
    "itemCategories": [{ 
     "items": [456], 
     "categories": [ 
      [{ 
       "_id": 789 
      }], 
      [{ 
       "_id": 890 
      }] 
     ] 
    }, { 
     "items": [234], 
     "categories": [ 
      [{ 
       "_id": 567 
      }], 
      [{ 
       "_id": 678 
      }] 
     ] 
    }] 
} 
+0

감사합니다, 거의 내가 원하는! – JSX