2

ユーザーと投稿のコレクションがあるとします。投稿収集では、ユーザー名をキーとして投票保存します。

db.user.insert({name:'a', age:12});
db.user.insert({name:'b', age:12});
db.user.insert({name:'c', age:22});
db.user.insert({name:'d', age:22});

db.post.insert({Title:'Title1', vote:[a]});
db.post.insert({Title:'Title2', vote:[a,b]});
db.post.insert({Title:'Title3', vote:[a,b,c]});
db.post.insert({Title:'Title4', vote:[a,b,c,d]});

投稿ごとにグループ化したいと思います。タイトルと、さまざまなユーザー年齢での投票数を調べます。

> {_id:'Title1', value:{ ages:[{age:12, Count:1},{age:22, Count:0}]} }
> {_id:'Title2', value:{ ages:[{age:12, Count:2},{age:22, Count:0}]} }
> {_id:'Title3', value:{ ages:[{age:12, Count:2},{age:22, Count:1}]} }
> {_id:'Title4', value:{ ages:[{age:12, Count:2},{age:22, Count:2}]} }

私は検索しましたが、mongodbmapreduceの2つのコレクションにアクセスする方法が見つかりません。再削減で達成することは可能でしょうか?

ユーザードキュメントを投稿に埋め込むのは非常に簡単ですが、実際のユーザードキュメントには多くのプロパティがあるため、これを行うのは良い方法ではありません。簡略化されたバージョンのユーザードキュメントを含めると、分析の次元が制限されます。

{Title:'Title1', vote:[{name:'a', age:12}]}
4

2 に答える 2

1

MongoDBには、マルチコレクションのMap/Reduceはありません。MongoDBにはJOIN構文がないため、アドホック結合にはあまり適していない可能性があります。このデータを何らかの方法で非正規化する必要があります。

いくつかのオプションがあります。

オプション#1:投票に年齢を埋め込みます。

{Title:'Title1', vote:[{name:'a', age:12}]}

オプション#2:年齢のカウンターを維持する

{Title:'Title1', vote:[a, b], age: { "12" : 1, "22" : 1 }}

オプション#3:「手動」参加を行う

最後のオプションは、for両方のコレクションをループし、データを正しくマージするスクリプト/コードを作成することです。

したがって、ループしpostて、タイトルと投票リストを含むコレクションを出力します。次に、新しいコレクションをループし、それぞれを検索して年齢を更新しますuser

私のおすすめ

#1または#2で行きます。

于 2011-11-01T17:53:08.800 に答える
0

それ以外の

{name:'a', age:12}

ユーザードキュメントに新しいフィールドを追加し、投票の更新ごとにそれを維持する方が簡単です。もちろん、mapreduceを使用してデータを分析することもできます。

{name:'a', age:12, voteTitle:["Title1","Title2","Title3","Title4"]}
于 2011-11-02T03:44:06.607 に答える