我在appcloud上使用mongodb作为服务部署了一个nodejs应用程序,我想使用mapReduce进行一些查询但是我收到了这个错误:
2016-10-21 15:45:52 [APP / 0] ERR ERR! {[MongoError:没有js引擎无法运行map reduce]
是否支持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);
});
});
});
}

答案 0 :(得分:2)
您正在使用Swisscom的基于Docker的MongoDB服务。
Swisscom以security.javascriptEnabled
开始了mongod启用或禁用服务器端JavaScript执行。什么时候 禁用,您不能使用执行服务器端执行的操作 JavaScript代码,例如$ where查询运算符,mapReduce 命令和db.collection.mapReduce()方法,组命令和 db.collection.group()方法。
Swisscom因安全性而启用了该标志。这是强化MongoDB的最佳实践。 Swisscom对此进行技术论证和讨论是开放的。也许Swisscom错过了一个重要的事实?
security:
authorization: enabled
javascriptEnabled: false
Swisscom提供其他MongoDB服务(不在docker容器中,3个具有复制功能的专用VM)。你没有这个限制。
$ 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
通过此计划,您将获得MongoDB的企业版并访问Ops Manager。在Ops Manager中,您将看到包含MongoDB指标的精美HTML5图表。它是db.runCommand( { serverStatus: 1 } )历史悠久的GUI前端。