2016-04-13 11 views
1

MongoDBでクエリを実行しようとしていますが、それを把握できないようです。私は、異なるAPIから同時にデータを収集し、それらを異なるドキュメントの同じコレクションに挿入する2つのスクレーパーを持っています。私は私のコレクションの次のドキュメントがある場合:クエリ後すべてのキーと値を保存しながらMongoDBでグループ化する

{ 
'scraper': 1, 
'time': 24, 
'number: 500 
} 

{ 
'scraper': 2, 
'time': 24, 
'number: 600 
} 

{ 
'scraper': 1, 
'time': 12, 
'number: 700 
} 

{ 
'scraper': 2, 
'time': 12, 
'number: 800 
} 

を、私は時間に基づいてデータ(ひいてはグループ)を比較したいのですが、一緒に両方の文書のスクレーパーのidのと数字をキープ。

{ 
'time': 24, 
'data':[ 
    {'scraper':1, 'number:500}, 
    {'scraper':2, 'number':600}] 
} 

{ 
'time': 12, 
'data':[ 
    {'scraper':1, 'number:700}, 
    {'scraper':2, 'number':800}] 
} 

私は自分の試みをリンクしますが、私は遠く離れています。私は何とか集約とグループを使用する必要があると思うが、私はどのように両方のドキュメントからデータを保持し、それを再配置するのか分からないようだ。

ありがとうございました!

答えて

2

あなたの集計グループで正しい軌道に乗っている、$ addToSetは、元の一意の値を維持するか、重複を保持したい場合は、$プッシュを使用することができます。

addToSet:

db.groups.aggregate([ 
    {$group: {_id: '$time', data: {$addToSet: {scraper: '$scraper', number: '$number' }}}} 
]) 

プッシュ:

db.groups.aggregate([ 
    {$group: {_id: '$time', data: {$push: {scraper: '$scraper', number: '$number' }}}} 
]) 

(両方ともあなたが提供したデータセットと同じ結果が得られます)

フィールド名を維持する場合は、_idの代わりに 'time'が重要です。プロジェクトフェーズを追加することができます。

db.groups.aggregate([ 
    {$group: {_id: '$time', data: {$push: {scraper: '$scraper', number: '$number' }}}}, 
    {$project: {_id: 0, time: '$_id', data: 1}} 
])