2016-10-21 3 views
1

я развернула nodejs приложения на appcloud с MongoDB в качестве службы, я хотел бы использовать MapReduce для некоторых запросов, но я получил эту ошибку:MongoDB не может запустить карту уменьшить без Js двигателя

2016-10-21 15: 45:52 [APP/0] ERR ERR! {[MongoError: невозможно запустить карту без механизма js]

Поддерживается ли это при использовании swisscom appcloud или что?

Это мой контроллер (экстракт):

'use strict'; 
 

 
const mongo = require('../mongoclient'); 
 
const paramsParser = require('../paramsParser'); 
 
const log = require('npmlog'); 
 
const faker = require('faker'); 
 
const _ = require('lodash'); 
 

 
const datapoints = function (router) { 
 

 
    const map = function() { 
 
    var payload = this.payload; 
 
    if (payload) { 
 
     payload = payload.toLowerCase().split(" "); 
 
     for (var i = payload.length - 1; i >= 0; i--) { 
 
     payload[i] = payload[i].replace(/[^\w\s]|_/g, "").replace(/\s+/g, " "); 
 
     if (payload[i] && payload[i].length > 7) { 
 
      emit(payload[i], 1); // store a 1 for each word 
 
     } 
 
     } 
 
    } 
 
    } 
 

 
    const reduce = function(key, values) { 
 
    var count = 0; 
 
    values.forEach(function (v) { 
 
     count += v; 
 
    }); 
 
    return count; 
 
    } 
 
    
 
    router.get('/counts', function (req, res) { 
 
    const filters = paramsParser.parse(req.query); 
 

 
    mongo.mapReduce(map, reduce, filters) 
 
     .then(function (data) { 
 
     const topics = data 
 
      .sort((a, b) => b.value - a.value) 
 
      .slice(0, 10) 
 
      .map(function(topic) { 
 
      return { id: faker.random.uuid(), title: topic._id, score: topic.value } 
 
      }); 
 
     res.json(topics); 
 
     }) 
 
     .catch(function(err) { 
 
     log.error(err); 
 
     res.sendStatus(500); 
 
     }); 
 
    }); 
 

 
}; 
 

 
module.exports = datapoints;

function mapReduce(map, reduce, filters) { 
 
    filters = filters ? filters : defaults; 
 
    return new Promise(function(resolve, reject) { 
 
    client.connect(uri(), function(err, db) { 
 
     db.collection(collection) 
 
     .mapReduce(map, reduce, { out: { inline: 1 }, query: filters.find, limit: filters.pageSize }, function(err, docs) { 
 
      if (err) { 
 
      reject(err); 
 
      } 
 
      resolve(docs); 
 
     }); 
 
    }); 
 
    }); 
 
}

ответ

2

Вы используете на основе Docker службы MongoDB Swisscom в.

Swisscom начал mongod с security.javascriptEnabled

Enables or disables the server-side JavaScript execution. When disabled, you cannot use operations that perform server-side execution of JavaScript code, such as the $where query operator, mapReduce command and the db.collection.mapReduce() method, group command and the db.collection.group() method.

Swisscom включен этот флаг из-за безопасности. Это лучшая практика для упрочения MongoDB. Swisscom открыт для технических аргументов и обсуждений по этому поводу. Может быть, Swisscom пропускает важный факт?

security: 
    authorization: enabled 
    javascriptEnabled: false 

Swisscom предлагает другую услугу MongoDB (не в Докер контейнер, 3 выделенных виртуальных машин с помощью репликации). Там у вас нет этого ограничения.

$ cf m -s mongodbent 
Getting service plan information for service mongodbent as admin... 
OK 

service plan description                         free or paid 
small3rs  Replica Set with 3 data bearing nodes with 32 GB memory, 320 GB storage, unlimited concurrent connections paid 
medium3rs  Replica Set with 3 data bearing nodes with 48 GB memory, 480 GB storage, unlimited concurrent connections paid 
large3rs  Replica Set with 3 data bearing nodes with 64 GB memory, 640 GB storage, unlimited concurrent connections paid 

С этим планом вы получите версию Enterprise из MongoDB и доступа к Ops Manager. В Ops Manager вы увидите хорошие графики HTML5 с метрикой MongoDB. Это приятный интерфейс GUI для db.runCommand({ serverStatus: 1 }) с историей.

 Смежные вопросы

  • Нет связанных вопросов^_^