2017-04-18 13 views
1

タイトルが説明的でない場合は申し訳ありませんが、私は自分の問題をより良く表現する方法を知らなかった。MongoDBグループ2つのフィールドが1つの配列または同じフィールド名のものとして

私はこの種のデータが含まれている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"] 
    } 
] 

をそして私は、彼らが同じフィールド名を持つように1列または少なくともadditionalArtists.nameとartist.members.nameを持ちたいです( "musician.name"のように)私はデータベースから別のミュージシャンを取り出すことができます。

私のデータベースはあまりフォーマットされていませんが、この種の奇妙なデータベースは今のところそれを行うべきです。

集計$ project my solutionですか?

+0

あなたのクエリフィルタは何ですか?各文書またはマルチ文書全体で別個の名前が必要ですか? – Veeram

+0

私はnon-sqlボキャブラリで新しくなっていますので、私は確信していませんが、上記のようなCDをたくさん持っています。そして、私はデータベースにあるすべてのミュージシャンを提供するクエリを実行したいと思います。そして、ミュージシャンは、データ例(「additionalArtists.name」と「artist.members.name」)のように2つの場所に保存されます 私は質問に答えましたか? 複数のドキュメントにまたがっていると思います。 – Dosentti

+0

ありがとうございました。私は答えを加えて、そこから作業することができます。あなたのmongo版は何ですか? – 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

ありがとうございます。それは私が必要としていたほとんどです。変更したのは、$ artist.nameを$ setUnionの中の$ artist.members.nameに変更しただけです。 結果は1つの配列には入っていないので、プログラムでこのデータを使用する必要がある場合は、まだ変更が必要ですが、今のところこれは私にとってはうまくいきます。 – Dosentti

+0

あなたは大歓迎です。 'artist.members.name'が配列なので[]を取り除きます。 'artist.name'がフィールドと集合体であるために私が[]を使う唯一の理由は配列だけです。 – Veeram

+0

Aight、私は実際には、すべての作業を少しシンプルにするためにデータベース内のいくつかの変更が、あなたのポイントはまだ立っています。ありがとう。 – Dosentti

関連する問題