2017-11-16 14 views
0

태그 필드가있는 문서가 있습니다. 태그 이름이 들어있는 간단한 배열입니다. 내부에는 객체 나 _id가 없습니다. ["Protocol", "Access", "Leverage", "Capability"]과 같은 일반 태그 만 사용하십시오.MongoDB 집합체, 그룹 파이프 라인에 배열의 각 요소를 추가하는 방법

내 그룹 파이프 라인에서 나는 'selectedTags': { $addToSet: '$tags' }과 같은 것을 시도했지만 태그 배열이 포함 된 배열로 끝납니다. 그리고 $push과 똑같습니다.

$each 또는 $pushAll을 사용하려고했지만 내 쉘이 말한 것처럼 그룹화 연산자로 지원되지 않습니다.

누군가 나를 도와주세요.

샘플 문서 :

당신에게

편집 감사

{ 
    "_id" : "HWEdDGsq86x4ikDSQ", 
    "teamId" : "AdLizGnPuqbWNsFHe", 
    "ownerId" : "Qb5EigWjqn2t3bfxD", 
    "type" : "meeting", 
    "topic" : "Grass-roots hybrid knowledge user", 
    "fullname" : "Guidouil", 
    "startDate" : ISODate("2017-07-30T09:00:05.513Z"), 
    "shareResults" : true, 
    "open" : true, 
    "language" : "fr", 
    "tags" : [ 
     "Protocol", 
     "Challenge", 
     "Artificial Intelligence", 
     "Capability" 
    ], 
    "isDemo" : true, 
    "createdAt" : ISODate("2017-11-15T19:24:05.513Z"), 
    "participantsCount" : 10, 
    "ratersCount" : 10, 
    "averageRating" : 3.4, 
    "hasAnswers" : true, 
    "updatedAt" : ISODate("2017-11-15T19:24:05.562Z") 
} 
{ 
    "_id" : "rXvkFndpXwJ6KAvNo", 
    "teamId" : "AdLizGnPuqbWNsFHe", 
    "ownerId" : "Qb5EigWjqn2t3bfxD", 
    "type" : "meeting", 
    "topic" : "Profit-focused modular system engine", 
    "fullname" : "Guidouil", 
    "startDate" : ISODate("2017-07-24T12:00:05.564Z"), 
    "shareResults" : true, 
    "open" : true, 
    "language" : "fr", 
    "tags" : [ 
     "Initiative", 
     "Artificial Intelligence", 
     "Protocol", 
     "Utilisation" 
    ], 
    "isDemo" : true, 
    "createdAt" : ISODate("2017-11-15T19:24:05.564Z"), 
    "participantsCount" : 33, 
    "ratersCount" : 33, 
    "averageRating" : 2.9393939393939394, 
    "hasAnswers" : true, 
    "updatedAt" : ISODate("2017-11-15T19:24:05.753Z") 
} 

집계 :

db.surveys.aggregate(
    { $match: query }, 
    { 
    $group: { 
     '_id': { 
     'year': { $year: '$startDate' }, 
     'day': { $dayOfYear: '$startDate' }, 
     }, 
     'participants': { $sum: '$ratersCount' }, 
     'rating': { $avg: '$averageRating' }, 
     'surveys': { $push: '$_id' }, 
     'selectedTags': { $addToSet: '$tags' }, 
     'peoples': { $addToSet: '$fullname' }, 
    } 
    }, 
    { $sort: { _id: 1 } } 
); 

다음 내가 { $push: { $each: '$tags' } } 또는 { $pushAll: '$tags' }에 selectedTags을 변경하려고했지만이되지 않습니다 실행 :(

편집 2 :

자바 스크립트에서 나는 그런 식으로 그것을 할 :

return Surveys.aggregate(
    { $match: query }, 
    { $group: { 
    _id: dateGroup, 
    participants: { $sum: '$ratersCount' }, 
    rating: { $avg: '$averageRating' }, 
    surveys: { $push: '$_id' }, 
    selectedTags: { $push: '$tags' }, 
    peoples: { $addToSet: '$fullname' }, 
    } }, 
    { $project: { 
    _id: null, 
    selectedTags: { 
     $reduce: { 
     input: "$selectedTags", 
     initialValue: [], 
     in: { $setUnion: ["$$value", "$$this"] } 
     } 
    }, 
    } } 
); 
+0

시도를 표시 할 수 있습니까? 당신이 성취하려고 노력하고있는 것에 대해 약간의 빛을 비춰 줄 수 있습니다. –

답변

1

는 무대와 $reduce + $setUnion 그룹화에 $push의 조합을 사용할 수 있습니다 집계 파이프 라인에 $addToSet update operator with $each modifier의 기능을 모방하려면 투영 단계에서. 예컨대 : selectedTags 배열에있는 모든 문서에서 태그의 고유 한 목록을 포함하는 하나의 문서로

db.collection.aggregate([ 
    {$group:{ 
     _id: null, 
     selectedTags: { $push: '$tags' }  
    }}, 
    {$project: { 
     selectedTags: { $reduce: { 
      input: "$selectedTags", 
      initialValue: [], 
      in: {$setUnion : ["$$value", "$$this"]} 
     }} 
    }} 
]) 

결과.

+0

네 말이 맞아, 내가 원하는 것에 더 가까워지고있어. 이제 배열 배열을 가지고있다. 이렇게 :'SelectedTags : [[ "활용", "활용", "능력", "이니셔티브"]] ' – Guidouil

+0

어떻게? 대답의 스 니펫은 태그의 편평한 배열을 반환합니다. –

+0

다른 필드는 여전히 필요하므로이 작업을 수행했습니다. – Guidouil