В последнее время я немного поигрался с потоковым API Twitter, чтобы увидеть, какие ссылки чаще всего публикуются людьми, за которыми я следую, и затем сохранять соответствующие твиты в CouchDB.
Недавно я столкнулся с проблемой, которую долго пытался решить.
На основе следующей функции карты:
{ "_id" : "_design/query", "views" : { "by_link" : { "map" : "function(doc){ emit(doc.actual_link, { user : doc.user.screen_name, text : doc.text })}" } } }
Что приводит к следующему набору данных:
curl http://127.0.0.1:5984/twitter_links/_design/query/_view/by_link?limit=20{"total_rows":7035,"offset":0,"rows":[ {"id":"abf54db1d92bfe0e8aaaa9ec51f237bd","key":"http://2dboy.com/2011/02/08/ipad-launch/","value":{"user":"Nash","text":"World of Goo\u2019s iPad Launch http://instapaper.com/zzqrqw32e"}}, {"id":"b8911545ff45438671081260ae0d42b1","key":"http://3.bp.blogspot.com/_T6MpHfZv2qQ/SpKGGjsoQoI/AAAAAAAADIA/Jsa5JDqX9X0/s400/moleskine3.jpg","value":{"user":"oinonio","text":"@stephenfry a Babushka Little My? http://bit.ly/fjPg2a"}}, {"id":"be12d30d1c8b882d8ce0124585fabb19","key":"http://3.bp.blogspot.com/_UAzEooLfuI8/S7aOiCBdAzI/AAAAAAAAF8Y/5W61I9VHxPE/s1600-h/deforestation.jpg","value":{"user":"ironshay","text":"A big problem caused by deforestation http://bit.ly/9qArCg"}} ]}
То, что я хочу сделать, это перейти от …
- Ссылка URL 1 -> Tweet 1
- Ссылка Url 1 -> Tweet 2
- Ссылка Url 2 -> Tweet 3
… до …
- Ссылка URL 1 -> [Чирикать 1, Чирикать 2]
- URL ссылки 2 -> [Tweet3]
Первоначально я пытался использовать функцию уменьшения после того, как следовал за сообщением Криса Чэндлера в блоге, но это привело к ‘redu_overflow_error’.
Перрин отметил, что мне, вероятно, нужна была функция ссылки, и я наткнулся на блог Криса Строма, пытаясь понять, как это сделать.
{ "_id" : "_design/query", "views" : { "by_link" : { "map" : "function(doc){ emit(doc.actual_link, { user : doc.user.screen_name, text : doc.text })}" } }, "lists" : { "index_tweets" : "function(head, req) { var row, last_key, tweets; send('{\"rows\" : ['); while(row = getRow()) { if(last_key != row.key ) { if(last_key != 'undefined') { send(toJSON({key : last_key, values : tweets})); send(','); } tweets = []; last_key = row.key; } tweets.push(row.value); } send(toJSON({key : last_key, values : tweets})); send(']}'); }" } }
Затем мы вызываем функцию списка со связанной функцией представления, следуя этому шаблону из CouchDB: Полное руководство :
/ Вид имя / дб / _design / Foo / _list / имя_списка
curl http://127.0.0.1:5984/twitter_links/_design/query/_list/index_tweets/by_link
Который дает данные в требуемом формате:
{"rows" : [ {"key":"http://1.bp.blogspot.com/_XdP6Lp2ceqY/TU16NvdT-RI/AAAAAAAAlb8/7QtTN-XxBTM/s400/dcrHk.jpg","values":[{"user":"jhartikainen","text":"RT @codepo8: The dark secret of PacMan: http://bit.ly/exCBDy"}, {"user":"joedevon","text":"RT @codepo8: The dark secret of PacMan: http://bit.ly/exCBDy"}]}, {"key":"http://10poundpom.blogspot.com/","values":[{"user":"10poundpomCL","text":"@andy_murray Help my #£10aWeekCharityChallenge, all it takes is a RT. Read http://10poundpom.blogspot.com/ for more."}]}, {"key":"http://10rem.net/blog/2011/02/09/enhancing-the-wpf-screen-capture-program-with-window-borders","values":[{"user":"brian_henderson","text":"Enhancing the WPF Screen Capture Program with Window Borders: by @Pete_Brown: http://bit.ly/icmXG5 #wpf #win32"},{"user":"SittenSpynne","text":"RT @Pete_Brown: Blogged: Enhancing the WPF Screen Capture Program with Window Borders http://bit.ly/icmXG5 #wpf #win32"}]}]}
Может быть, есть еще лучший способ решить эту проблему, о которой я не знаю … дайте мне знать, если есть!