2017-04-18 7 views
1

제목이 설명이 아니 어서 유감스럽게 생각합니다. 내 문제를 더 잘 표현하지 못했습니다.MongoDB 그룹 하나의 배열 또는 동일한 필드 이름을 가진 두 개의 개별 필드

나는 이러한 종류의 데이터가 들어있는 CD 데이터베이스가 있습니다

{ 
"albumInfo": { 
    "name": "Angels Fall First", 
    "type": "LP", 
    "genre": ["symphonic metal", "power metal", "folk metal"], 
    "publicationYear": 1997, 
    "tags":["tag1", "tag2", "tag3"], 
    "stars": 4 
}, 

"artist": { 
    "name":"Nightwish", 
    "members": [ 
     { 
      "name": "Tarja Turunen", 
      "instruments": ["lead vocals"] 
     }, 
     { 
      "name": "Tuomas Holopainen", 
      "instruments": ["piano", "synthesizers", "keyboards", "vocals"] 
     }, 
     { 
      "name": "Erno Vuorinen", 
      "instruments": ["guitar"] 
     }, 
     { 
      "name": "Jukka Nevalainen", 
      "instruments": ["drums", "percussion"] 
     } 
    ] 
}, 

"additionalArtists": [ 
    { 
     "name": "Esa Lehtinen", 
     "instruments": ["flutes"] 
    } 
] 

를 그리고 하나 개의 어레이에 additionalArtists.name 및 artist.members.name이 있거나 적어도 있도록 그들이 같은 필드 이름을 갖고 싶어 (예 : "musician.name") 데이터베이스에서 뚜렷한 음악가를 가져올 수 있습니다.

내 데이터베이스의 형식이 올바르지 않습니다. 그런데 이런 종류의 이상한 데이터베이스는 지금해야합니다.

aggregate $ project my solution입니까?

+0

귀하의 검색어 필터는 무엇입니까? 각 문서에서 또는 여러 문서간에 고유 한 이름을 원하십니까? – Veeram

+0

나는 비 SQL 어휘에 익숙하지 않기 때문에 확신이 없지만 위에 게시 한 CD와 같은 많은 CD를 가지고 있습니다. 데이터베이스에있는 모든 뮤지션에게 저에게 질문하는 쿼리를 원합니다. 그리고 음악가는 데이터 예제 ("additionalArtists.name"및 "artist.members.name")와 같이 두 위치에 저장됩니다. 질문에 대답 했습니까? 여러 문서에 걸쳐있는 것 같습니다. – Dosentti

+0

정보를 제공해 주셔서 감사합니다. 제가 답변을 추가하고 거기에서 일할 수있게하겠습니다. 당신의 몽고 버전은 무엇입니까? – Veeram

답변

2

당신은 그래서 당신은 $addToSet$groupmusicians 모든 문서에서 뚜렷한 얻을 수있는 두 뮤지션의 배열을 병합 $setUnion를 사용 $unwind 다음에 하나의 문서에 musicians 모든 별개를 얻을 수 있습니다.

db.collection.aggregate(
    { $project: { musician: { $setUnion: [ ["$artist.name"], "$additionalArtists.name" ] }, _id: 0 } }, 
    { $unwind: "$musician"}, 
    { $group: {_id:null , musician: {$addToSet:"$musician" } }} 
) 
+0

대단히 감사합니다. 거의 필요한 것입니다. 수정해야 할 것은 $ setUnion에서 "artist.name"을 "artist.members.name"으로 변경했다는 것입니다. 결과가 하나의 배열로 제공되지 않기 때문에 프로그램에서이 데이터를 사용해야 할 경우 여전히 약간의 수정이 필요하지만 지금은 나에게 적합합니다. – Dosentti

+0

당신은 오신 것을 환영합니다. 'artist.members.name'이 배열이기 때문에 []를 제거하십시오. 'artist.name'이 필드이고 set union이 배열이기 때문에 []을 사용하는 유일한 이유는 배열을 취하는 것입니다. – Veeram

+0

Aight, 나는 모든 것을 조금 더 단순하게 만들기 위해 DB에서 몇 가지를 실제로 변경했지만, 여전히 귀하의 요점은 여전히 ​​유효합니다. 감사. – Dosentti