2017-12-30 15 views
0

나는 장바구니를 개발 중이고 현재 나의 요구 사항은 상점 주인에게 대시 보드를 표시하는 것입니다. 제품 이름에 중복이있을 수 있으므로 주문한 제품을 제품 ID로 그룹화하고 합계를 수행하여 총 주문 수를 계산했습니다. 이제는 읽을 수있는 이름이 필요하지만 그렇게하면 오류가 발생합니다.mongoDB/mongoose 집계 파이프 라인을 사용하여 사용자 정의 필드를 기반으로 집계 된 값을 얻으려면 어떻게해야합니까?

쿼리

ShoppingCart 
    .aggregate({ $match: { "orderedProducts.registrationDetails.createdByID": LOGGED_IN_ADMIS_ID } }) 
    .project("orderedProducts.productID orderedProducts.title orderedProducts.qty -_id") 
    .unwind("orderedProducts") 
    .group({ _id: "$orderedProducts.productID", counts: { $sum: "$orderedProducts.qty" }, title: "$orderedProducts.title" }) 
    .exec((err, docs) => { 
     if (err) { 
      return res.status(503).send(err); 
     } 
     res.send(docs); 
    }); 

오류 메시지 :

{ "이름": "MongoError", "메시지": "필드 '제목'는 누적 객체 여야합니다", " OK "0"에 errmsg는 ":"필드 '제목'는 어큐뮬레이터 개체 ","코드이어야 "40,234"코드 명 ""Location40234은 "}

이는 부분 인 오류의 원인입니다 제목 : "$ orderedProducts.title"

답변

1

나는 group 연산자에 문제가 있다고 생각합니다. 특히 title: "$orderedProducts.title"을 수행 중이므로 그룹화에 문제가 발생할 수 있습니다. MongoDB는 아마도 어떤 문서에서 어떤 제목을 사용할 지 우선 순위를 정할 방법이 없으므로이 사건을 어떻게 처리 할 수 ​​있을지 이해하지 못할 것입니다. 이것이 어큐뮬레이터의 일부 형태가 예상되는 이유입니다. qty 필드에서 사용중인 $sum

대신 그룹핑 title 부를 생략 시도 대신 화합물 _id 사용 :

ShoppingCart 
    .aggregate({ $match: { "orderedProducts.registrationDetails.createdByID": LOGGED_IN_ADMIS_ID } }) 
    .project("orderedProducts.productID orderedProducts.title orderedProducts.qty -_id") 
    .unwind("orderedProducts") 
    .group({ _id: { productId: "$orderedProducts.productID", title: "$orderedProducts.title" }, counts: { $sum: "$orderedProducts.qty" } }) 
    .exec((err, docs) => { 
     if (err) { 
      return res.status(503).send(err); 
     } 
     res.send(docs); 
    }); 

용액에주의 할 점은 각 productID 대해 오직 하나 개의 타이틀이 있다고 가정한다. productIDtitle로 그룹화되므로 동일한 productID에 대한 다른 제목이 있으면이 솔루션이 실패하게됩니다. 이 당신을 위해 문제이고 대신 주어진 productID 모든 제품 타이틀을 잡아하려는 경우, 다음을 수행 할 수

ShoppingCart 
    .aggregate({ $match: { "orderedProducts.registrationDetails.createdByID": LOGGED_IN_ADMIS_ID } }) 
    .project("orderedProducts.productID orderedProducts.title orderedProducts.qty -_id") 
    .unwind("orderedProducts") 
    .group({ _id: "$orderedProducts.productID", counts: { $sum: "$orderedProducts.qty" }, titles: { $addToSet: "$orderedProducts.title" } }) 
    .exec((err, docs) => { 
     if (err) { 
      return res.status(503).send(err); 
     } 
     res.send(docs); 
    }); 
0

중 첫 번째 그룹 파이프 라인에 $ 마지막 또는 $를 사용을

.group({ 
    _id: "$orderedProducts.productID", 
    counts: { $sum: "$orderedProducts.qty" }, 
    title: { $first:"$orderedProducts.title"} 
}) 
당신이 제품을 그룹화하고 있기 때문에

또는

.group({ 
    _id: "$orderedProducts.productID", 
    counts: { $sum: "$orderedProducts.qty" }, 
    title: { $last:"$orderedProducts.title"} 
}) 

은, 제목이 비슷한 PRODUCT_ID에 남아 있어야한다. 그래서 마지막으로 그룹화 된 객체와 연결될 첫 번째 객체 또는 마지막 객체를 선택할 수 있습니다.

+0

친애하는 @imixtron 귀하의 제안에 감사드립니다. 문제는 제품의 이름이 내 경우에 고유하지 않다는 것입니다. 사용자가 이름이 같은 두 개 이상의 다른 제품을 만들 가능성이 있습니다. 따라서 이름 대신 제품 ID로 제품을 그룹화했습니다. – Taha

+0

내 쿼리는 ** _ id **에 따라 그룹화가 동일합니다. 그룹화 된 모든 문서에는 동일한 문서가 있습니다. 따라서 시작 또는 끝에서 하나를 선택할 수 있습니다. – imixtron

+0

죄송합니다. 잘못 처리 했으므로 고쳐 주셔서 감사합니다. – Taha

관련 문제