CouchDB 不支持新的 Map()?寻找一个好的替代品
Posted
技术标签:
【中文标题】CouchDB 不支持新的 Map()?寻找一个好的替代品【英文标题】:new Map() not supported on CouchDB? Looking for a good alternative 【发布时间】:2016-06-22 08:13:37 【问题描述】:我正在尝试在 CouchDB 上使用 Futon 构建 Map-reduce 视图。 map-part 代码如下:
function(doc)
var m = new Map(); // dictionary
m.set('molto', 'R');
m.set('davvero', 'R');
m.set('veramente', 'R');
m.set('troppo', 'R');
m.set('bel', 'R');
m.set('bello', 'R');
m.set('ben', 'R');
m.set('molti', 'R');
m.set('sicuramente', 'R');
m.set('tante', 'R');
m.set('incredibile', 'R');
m.set('tanta', 'R');
m.set('top', 'R');
m.set('troppi', 'R');
m.set('urla', 'R');
m.set('assolutamente', 'R');
m.set('boom', 'R');
m.set('esattamente', 'R');
m.set('grave', 'R');
m.set('perfetto', 'R');
m.set('riconferma', 'R');
m.set('accusa', 'R');
m.set('deciso', 'R');
m.set('grande', 'P');
m.set('#superstar', 'P');
m.set('#napolivale', 'P');
m.set('#brambillasindaco', 'P');
m.set('bene', 'P');
m.set('forza', 'P');
m.set('VERO', 'P');
m.set('sostegno', 'P');
m.set('merita', 'P');
m.set('lavoro', 'P');
m.set('bravo', 'P');
m.set('cuore', 'P');
m.set('dema', 'P');
m.set('tanti', 'P');
m.set('vincere', 'P');
m.set('buon', 'P');
m.set('caro', 'P');
m.set('masaniello', 'P');
m.set('complimenti', 'P');
m.set('futuro', 'P');
m.set('buona', 'P');
m.set('#stavotalettieri', 'P');
m.set('coraggio', 'P');
m.set('#sindaco', 'P');
m.set('cara', 'P');
m.set('cambiamento', 'P');
m.set('#napolicapitale', 'P');
m.set('leader', 'P');
m.set('piace', 'P');
m.set('proposte', 'P');
m.set('risultati', 'P');
m.set('#decidelacittà ', 'P');
m.set('#napolié5stelle', 'P');
m.set('dignità ', 'P');
m.set('finalmente', 'P');
m.set('impegno', 'P');
m.set('speciale', 'P');
m.set('onestà ', 'P');
m.set('passione', 'P');
m.set('possibile', 'P');
m.set('speranza', 'P');
m.set('stile', 'P');
m.set('successo', 'P');
m.set('#sindacoxnapoli', 'P');
m.set('fiducia', 'P');
m.set('grandi', 'P');
m.set('legalità ', 'P');
m.set('rivoluzione', 'P');
m.set('voterei', 'P');
m.set('#napolibenecomune', 'P');
m.set('bellissima', 'P');
m.set('idee', 'P');
m.set('merito', 'P');
m.set('pulita', 'P');
m.set('sociale', 'P');
m.set('uniti', 'P');
m.set('valori', 'P');
m.set('#iovotodemagistris', 'P');
m.set('#iovotono', 'P');
m.set('#lettierisindaco', 'P');
m.set('#liberiamonapoli', 'P');
m.set('#marapernapoli', 'P');
m.set('libertà ', 'P');
m.set('popolari', 'P');
m.set('tifo', 'P');
m.set('vinciamo', 'P');
m.set('#corruzione', 'P');
m.set('#lavoro', 'P');
m.set('#pensioni', 'P');
m.set('amore', 'P');
m.set('belle', 'P');
m.set('grandissimo', 'P');
m.set('onesto', 'P');
m.set('riuscito', 'p');
m.set('sostiene', 'P');
m.set('vincente', 'P');
m.set('abbraccio', 'P');
m.set('adoro', 'P');
m.set('bellissimo', 'P');
m.set('big', 'P');
m.set('bravissimo', 'P');
m.set('classe', 'P');
m.set('compagno', 'P');
m.set('convinto', 'P');
m.set('luce', 'P');
m.set('pizza', 'P');
m.set('rielezione', 'P');
m.set('riparte', 'P');
m.set('#napoliautonoma', 'P');
m.set('#ricominciodalleperiferie', 'P');
m.set('libera', 'P');
m.set('migliore', 'P');
m.set('onesti', 'P');
m.set('palle', 'P');
m.set('popolare', 'P');
m.set('ribelle', 'P');
m.set('sicura', 'P');
m.set('simpatico', 'P');
m.set('stavolta', 'P');
m.set('trasparenza', 'P');
m.set('vamos', 'P');
m.set('votiamo', 'P');
m.set('#coraggio', 'P');
m.set('#decidelacitta', 'P');
m.set('#dema', 'P');
m.set('#esserenapoletanovuoldire', 'P');
m.set('#iovotoonesto', 'P');
m.set('#stalotalettieri', 'P');
m.set('brava', 'P');
m.set('buone', 'P');
m.set('piaciuto', 'P');
m.set('rappresenta', 'P');
m.set('splendido', 'P');
m.set('stavota', 'P');
m.set('#demagistrissindaco', 'P');
m.set('#lungomareliberato', 'P');
m.set('#savebikesharingnapoli', 'P');
m.set('amo', 'P');
m.set('applausi', 'P');
m.set('buono', 'P');
m.set('fortuna', 'P');
m.set('funziona', 'P');
m.set('gioia', 'P');
m.set('libero', 'P');
m.set('mafie', 'P');
m.set('meriti', 'P');
m.set('migliori', 'P');
m.set('miracolo', 'P');
m.set('opportunità ', 'P');
m.set('positivo', 'P');
m.set('qualità ', 'P');
m.set('riscatto', 'P');
m.set('sogno', 'P');
m.set('soluzione', 'P');
m.set('trasparenti', 'P');
m.set('#iopartecipo', 'P');
m.set('#iostocondemagistris', 'P');
m.set('#masaniello', 'P');
m.set('#napolipride', 'P');
m.set('#resistenza', 'P');
m.set('#riscetamento', 'P');
m.set('#votafi', 'P');
m.set('bravi', 'P');
m.set('capace', 'P');
m.set('coerenza', 'P');
m.set('combatte', 'P');
m.set('conoscere', 'P');
m.set('consigli', 'P');
m.set('credibile', 'P');
m.set('cultura', 'P');
m.set('docet', 'P');
m.set('faremo', 'P');
m.set('festa', 'P');
m.set('no', 'N');
m.set('cacare', 'N');
m.set('male', 'N');
m.set('vergogna', 'N');
m.set('fine', 'N');
m.set('problema', 'N');
m.set('#lariachetira', 'N');
m.set('cagare', 'N');
m.set('peggio', 'N');
m.set('perdere', 'N');
m.set('volgarità ', 'N');
m.set('peccato', 'N');
m.set('schifo', 'N');
m.set('abusivi', 'N');
m.set('degrado', 'N');
m.set('attacca', 'N');
m.set('peggiore', 'N');
m.set('populismo', 'N');
m.set('chiacchiere', 'N');
m.set('palazzo', 'N');
m.set('purtroppo', 'N');
m.set('spese', 'N');
m.set('vattene', 'N');
m.set('indegne', 'N');
m.set('merda', 'N');
m.set('minacce', 'N');
m.set('monnezza', 'N');
m.set('morte', 'N');
m.set('corrotti', 'N');
m.set('povera', 'N');
m.set('volgare', 'N');
m.set('cazzo', 'N');
m.set('fallimento', 'N');
m.set('flop', 'N');
m.set('minaccia', 'N');
m.set('bugie', 'N');
m.set('cacati', 'N');
m.set('colpa', 'N');
m.set('condannato', 'N');
m.set('dispiace', 'N');
m.set('distrutto', 'N');
m.set('dubbio', 'N');
m.set('errore', 'N');
m.set('#caffèscorretto', 'N');
m.set('#vergogna', 'N');
m.set('becero', 'N');
m.set('brutta', 'N');
m.set('bruttezza', 'N');
m.set('brutto', 'N');
m.set('fallito', 'N');
m.set('incapace', 'N');
m.set('inutili', 'N');
m.set('pessimo', 'N');
m.set('roba', 'N');
m.set('spieghi', 'N');
m.set('tristezza', 'N');
m.set('attacchini', 'N');
m.set('bocciato', 'N');
m.set('buffone', 'N');
m.set('crisi', 'N');
m.set('delirio', 'N');
m.set('disastro', 'N');
m.set('interista', 'N');
m.set('ridicolo', 'N');
m.set('rischio', 'N');
m.set('sangue', 'N');
m.set('solito', 'N');
m.set('vergognati', 'N');
m.set('violento', 'N');
m.set('#gomorralaserie', 'N');
m.set('culo', 'N');
m.set('esodato', 'N');
m.set('fallita', 'N');
m.set('falsità ', 'N');
m.set('fastidio', 'N');
m.set('non', 'I');
m.set('mai', 'I');
m.set('invece', 'I');
m.set('meno', 'I');
m.set('sbagliato', 'I');
m.set('nessuna', 'I');
m.set('not', 'I');
m.set('contrario', 'I');
m.set('diversa', 'I');
m.set('#jungels', 'A');
m.set('#moser', 'A');
m.set('@giroditalia', 'A');
m.set('#dumoulin', 'A');
m.set('#nibali', 'A');
m.set('#trentin', 'A');
m.set('#roglic', 'A');
m.set('#veloextra', 'A');
m.set('crono', 'A');
m.set('#gomorra2', 'A');
m.set('maillot', 'A');
m.set('#ciclismo', 'A');
m.set('http//cyclismactunet', 'A');
m.set('#girorai2016', 'A');
m.set('#saichivoti', 'A');
m.set('#eurosportciclismo', 'A');
m.set('dumoulin', 'A');
m.set('#fightforpink', 'A');
m.set('#giroditalia2016', 'A');
m.set('ciclabile', 'A');
m.set('ciclismo', 'A');
m.set('gregario', 'A');
var sentiment = 0;
var words = doc.text.split(' ');
for(var i = 0; i < words.length; i++)
var word = words[i].replace(/^\s+|\s+$/g,""); // trim
word = word.replace(/[?!.:,;-]/g,""); // strip punctuation
word = word.replace(/\"/g,""); // strip escaped quotes
word = word.toLowerCase();
if( word.length > 0 )
var prova = 0;
if( m.has(word) )
var sentChar = m.get(word);
switch (sentChar)
case 'P':
sentiment = sentiment+1;
break;
case 'N':
sentiment = sentiment-1;
break;
case 'I':
prova = 0;
break;
case 'R':
prova = 0;
break;
case 'A':
prova=0;
break;
emit(doc.Candidato,sentiment);
我尝试通过一个人工短语从 CouchDB 中运行部分代码,一切正常。但似乎 CouchDB 不喜欢 new Map() 或 m.set();
此代码应获取一条推文并根据此简短字典(意大利语)对其进行情感分析,例如,如果每个单词在字典中且标记为P(正)或 P(负)。我也有其他情况,对于“R”或“A”,我必须做不同的事情。
问题是:为什么 Map() 似乎在 CouchDB 上不起作用?我应该使用什么来避免对数组进行顺序搜索? (我的数据库中有 20k 条推文)
【问题讨论】:
【参考方案1】:Map 是一个 ES6 功能,在 CouchDB 包含的 Spidermonkey 版本中不支持。
一种选择是只使用一个普通的对象,警告/陷阱不应该适用于这种情况,因为意大利语的词典中没有 __proto__
这个词。
另一种选择是改用 Node.js 的更新版本 (v4+) 作为您的查询服务器。您可以找到该in the documentation 的说明。 (它被标记为“实验性”,因此您的里程可能会有所不同)
如果这两个选项都不可接受,您还可以找到 Map polyfill 库并将其包含为 CommonJS Module。
就我个人而言,我认为普通对象最吸引人,因为根据我对这种情况的了解,它的缺点最少,开销也最少。
【讨论】:
以上是关于CouchDB 不支持新的 Map()?寻找一个好的替代品的主要内容,如果未能解决你的问题,请参考以下文章