2017-04-18 1 views
1

Je suis désolé si le titre n'est pas descriptif, je ne savais pas comment mieux exprimer mon problème.MongoDB groupe deux champs séparés comme un tableau ou quelque chose avec le même nom de champ

J'ai une base de données de CD qui contient ce type de données:

{ 
"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"] 
    } 
] 

Et je veux avoir additionalArtists.name et artist.members.name dans un tableau ou au moins pour qu'ils aient même nom de domaine (comme "musician.name") afin que je puisse chercher des musiciens distincts de la base de données.

Ma base de données n'est pas très bien formatée, je suppose, mais ce genre de db bizarre devrait le faire pour l'instant.

Est-ce que aggregate $ projette ma solution?

+0

Quel est votre filtre de requête? Voulez-vous un nom distinct dans chaque document ou dans plusieurs documents? – Veeram

+0

Je suis nouveau avec le vocabulaire non-sql donc je ne suis pas tout à fait sûr mais j'ai DB qui a beaucoup de CD: s comme celui que j'ai posté ci-dessus. Et je veux faire une requête qui me donne tous les musiciens qui sont dans la base de données. Et les musiciens sont stockés à deux endroits comme dans l'exemple de données ("additionalArtists.name" et "artist.members.name") Ai-je répondu à la question? Je pense que c'est sur plusieurs documents. – Dosentti

+0

Merci pour l'information. Permettez-moi d'ajouter une réponse et nous pouvons travailler à partir de là. Quelle est ta version mongo? – Veeram

Répondre

2

Vous pouvez utiliser $setUnion pour fusionner les deux musiciens tableau et obtenir le tout musicians distincts dans un seul document suivi par $unwind afin que vous puissiez $groupmusicians avec $addToSet pour obtenir tous les documents distincts à travers.

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

Merci beaucoup. C'est presque ce dont j'avais besoin. Seules les modifications que j'ai dû faire, c'est que j'ai changé "$ artist.name" en "$ artist.members.name" dans $ setUnion. Le résultat ne vient pas dans un tableau, donc si j'avais besoin d'utiliser ces données dans le programme, il faudrait encore quelques modifications, mais pour l'instant cela fonctionne pour moi. – Dosentti

+0

Vous êtes les bienvenus. Débarrassez-vous de [] car 'artist.members.name' est un tableau. La seule raison pour laquelle j'utilise [] parce que 'artist.name' est un champ et que set union ne prend qu'un tableau. – Veeram

+0

Aight, j'ai changé quelques choses dans la base de données pour que tout fonctionne un peu plus facilement, mais votre point de vue est toujours là. Merci. – Dosentti