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()?寻找一个好的替代品的主要内容,如果未能解决你的问题,请参考以下文章

较新的 CouchDB/Sofa 教程

CouchDB 视图(map/reduce)

couchdb - Map Reduce - 如何在 Reduce 函数中加入不同的文档和组结果

为啥 couchdb 正在寻找“_users”数据库?

MongoDB与CouchDB 全方位对比

来自 Ektorp 的 CouchDB Map/Reduce 视图查询