2017-03-26 1 views
2

거기몽고 투영 필드 해당 필드가 같지 않음

내 질문이 혼동 스러울 수 있습니다. 더 자세히 설명해 드리겠습니다.

이와 같은 집계 문서가 있습니다.

{ 
    "metric" : "user_act", 
    "stream_id" : "f00001", 
    "values" : { 
    "likes" : 57, 
    "comments" : 0, 
    "shares" : 0 
    } 
} 
{ 
    "metric" : "user_act", 
    "stream_id" : "f00002", 
    "values" : { 
     "likes" : 28, 
     "comments" : 0, 
     "shares" : 1 
    } 
} 

{ 
    "metric" : "user_act", 
    "stream_id" : "t00001", 
    "values" : { 
     "favorites" : 5, 
     "retweets" : 15 
    } 
} 

저는 좋아요, 댓글 및 공유 합계로 참여도를 계산하고 싶습니다. 따라서 계산하기 전에 그룹화하기 전에 데이터를 투영해야합니다. 나는 다음과 같은 투사를 시도 0

모든 데이터 세트의 기본을 가지고 있지 않지만 때문에 작동하지 않을 경우 나는 sharescommentsvalues.favorites-likes, values.retweets을 매핑하고 싶은 $ifNull 우선 첫 번째 줄의 두 번째 줄의 값 .

{ 
    $project: { 
    "stream_id" : 1, 
    "shares": { 
     $ifNull: ["$values.retweets",0], 
     $ifNull: ["$values.shares", 0] 
    } , 
    "likes": { 
     $ifNull: ["$values.favorites",0], 
     $ifNull: ["$values.likes", 0] 
    } , 
    "comments": { 
     $ifNull: ["$values.replys",0], 
     $ifNull: ["$values.comments", 0] 
    } 
    } 
} 

아무쪼록? 미리 감사드립니다.

[업데이트] 이 같은 투영을 시도했지만 작동하지 않습니다. case: 필드가 있는지 어떻게 확인할 수 있습니까?

{ 
    $project: { 
    "stream_id" : 1, 
     "shares": { 
     $switch: { 
      branches: [ 
      { case: {$ne: ["$values.retweets", 0]}, 
       then: {$ifNull: ["$values.retweets", "$values.retweets"]} 
      }, 
      { case: {$ne: ["$values.shares", 0]}, 
       then: {$ifNull: ["$values.shares", "$values.shares"]} 
      } 
      ], 
      default: 0 
     } 
     } 
    } 
} 

답변

1

투영 $cond을 시도 할 수 있습니다.

db.collection.aggregate({ 
    $project: { 
    "stream_id" : 1, 
    "shares": { $cond: [ { $eq:[ { $ifNull: [ "$values.shares", 0 ] }, 0 ] },{ $ifNull: [ "$values.retweets", 0 ] }, "$values.shares" ] }, 
    "likes": { $cond: [ { $eq:[ { $ifNull: [ "$values.likes", 0 ] }, 0 ] }, { $ifNull: [ "$values.favorites", 0 ] }, "$values.likes" ] }, 
    "comments": { $cond: [ { $eq:[ { $ifNull: [ "$values.comments", 0] }, 0 ] }, { $ifNull: [ "$values.replys", 0 ] }, "$values.comments" ] } 
}}) 

$switch

db.collection.aggregate([{ 
    $project: { 
    "stream_id" : 1, 
     "shares": { 
     $switch: { 
      branches: [ 
      { case: { $ifNull: [ "$values.shares", false ] }, 
       then: "$values.shares" 
      }, 
      { case: { $ifNull: [ "$values.retweets", false ] }, 
       then: "$values.retweets" 
      }], 
      default: 0 
     } 
     } 
    } 
}]) 
+0

그래, 그것은 작품은 바로,이 조건의 사용? 내가 메트릭의 이름과 같은 IG 또는 Youtube와 같은 많은 사회적 요소가없는 경우 어떻게 처리 할 수 ​​있어요. – Bongsakorn

+0

정확하게. 더 많은 조건을 중첩시킬 수 있지만 너무 많은 데이터가있는 경우 데이터를 db에 삽입하기 전에 수정하는 것이 좋습니다. – Veeram

+0

죄송합니다. 수정 하시겠습니까? 나는이 $ values.love와 같은 문서를 문서에 가지고 있다고 가정합니다. 조건은 많은 중첩 된 상태 여야합니다. – Bongsakorn