1

我在 appcloud 上部署了一个 nodejs 应用程序,使用 mongodb 作为服务,我想使用 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);
        });
    });
  });
}

4

1 回答 1

2

您正在使用 Swisscom 的基于 Docker 的 MongoDB 服务。

Swisscom 使用security.javascriptEnabled启动 mongod

启用或禁用服务器端 JavaScript 执行。禁用时,您不能使用执行 JavaScript 代码的服务器端执行的操作,例如 $where 查询运算符、mapReduce 命令和 db.collection.mapReduce() 方法、group 命令和 db.collection.group() 方法.

Swisscom 出于安全考虑启用了该标志。这是强化 MongoDB 的最佳实践。瑞士电信对技术争论和讨论持开放态度。也许瑞士电信错过了一个重要的事实?

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 前端。

于 2016-10-27T16:49:20.663 回答