2016-04-13 19 views
1

MongoDB ile bir sorgu çalıştırmaya çalışıyorum, ama bunu anlayamıyorum. Farklı API'lardan aynı anda veri toplayan ve bunları farklı belgelerdeki aynı koleksiyona ekleyen iki kazıyıcım var. Aşağıdaki koleksiyonuma belgeleri varsa: sorgusundan sonraTüm anahtarları ve değerleri korurken MongoDB ile gruplandırma

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

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

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

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

, ben zamana dayalı verileri (ve dolayısıyla grup) karşılaştırmak, ancak birlikte her iki belgelerin kazıyıcı kimliklerini ve sayıları tutmak istiyorum.

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

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

Girişimi bağlarım, ancak çok uzaktayım. Sanırım bir şekilde .aggregate ve grup kullanmam gerekiyor, ancak verileri her iki belgeden nasıl koruyacağımı ve yeniden düzenleyemediğimi anlayamıyorum.

Yardımın için teşekkürler!

cevap

2

Sen agrega gruplarla doğru yoldasın, $ addToSet orijinal benzersiz değerler tutacak veya çiftleri korumak istiyorsanız $ itmek kullanabilirsiniz:

addToSet:

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

itme:

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

(veri sağladığınız set ile hem aynı sonucu verecektir)

Alan adını koruyorsanız, _id yerine 'time' sizin için önemlidir, ek bir proje aşaması ekleyebilirsiniz.

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