MongoDB典型使用

时间:2017-03-24 15:54:28

标签: php json node.js mongodb mapreduce

我是MongoDB的初学者,所以我有几个问题。首先,我的代码是用PHP编写的。我的使用背景如下:

  • 我有80,000个文件存储在一个集合中
  • 每个文档都有这种结构(键可以是1到20,每个文档中的值不同):
{
    "_id": "58c91c8059b0a500083dab0c",
    "year": "2017",
    "month": "03",
    "day": "15",
    "data": {
        "key-1": "value-1",
        "key-2": "value-2",
        "key-n": "value-n"
    }
}

我想获得具有特定密钥的所有文档并总结其价值。所以我使用了这段代码:

$manager = new \MongoDB\Driver\Manager( MONGO_SERVER );

$filter = array ( 
    "year" => $_POST['time_year'], 
    "month" => $_POST['time_month'], 
    "day" => $_POST['time_day']
);

$options = [
    'projection' => ['_id' => 0],
];

$query = new \MongoDB\Driver\Query($filter, $options);
$rows = $manager->executeQuery('REPORT.xxxxxxx', $query);

foreach ($rows as $entry) {
    [..]
}

但是我收到了这个错误:

Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)

所以,从这个问题我有这个问题:

  1. 使用MapReduce可以避免这个问题吗?
    • 我查看了一些使用PHP的MapReduce示例,但每个示例都使用了MongoCode。做了一些研究,我发现MongoCode类已被弃用,没有别的选择。
    • 有没有其他方法可以获得相同的结果(MongoDB \ Driver)?
  2. PHP是使用MongoDB的最佳语言吗? Node.js可能是更好的选择吗?
  3. 添加更多文件(每天80,000):这可能是MongoDB的问题吗?

1 个答案:

答案 0 :(得分:0)

您遇到了与MongoDB的内存池相关的问题,以及如何控制它。这是基于您的系统以各种方式完成的。

然而,在此之前,您正在从PHP的角度来看代码。我认为你应该看一看$ aggregate $ unwind和其他类似的MongoDB数据操作函数。

建议:花一些时间来理解和配置mongod.conf文件,并了解这些选项对您的系统意味着什么。然后花点时间看看Mongo使用文档检索数据之间的差异。

至于mongo的最佳语言..你可能会得到很多答案。 Mongo正式支持Node.js驱动程序,Mongo从一开始就一直在使用Node.js。 (想想PHP到MySQL和Node.js到MongoDB一样)。虽然我相信很多人会反驳这种类比。 但作为一名PHP程序员,我绝不会想到将PHP与Mongo一起使用。就我在过去两年中所看到和观察到的而言,Node简直就是Mongo的天然伙伴。