MongoDB 典型用途
MongoDB typical use
我是 MongoDB 的初学者,所以我有几个问题。首先我的代码是用PHP写的。我的使用上下文如下:
- 我在一个集合中存储了 80,000 个文档
- 每个文档都有这样的结构(Keys可以是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)
所以,从这个问题我有这个问题:
- 使用 MapReduce 可以避免这个问题吗?
- 我研究了一些使用 PHP 的 MapReduce 示例,但每个示例都使用了 MongoCode。通过一些研究,我发现 class MongoCode 已被弃用,而且别无选择。
- 有没有其他方法可以得到相同的结果(MongoDB\Driver)?
- PHP 是最适合使用的语言 MongoDB 吗? Node.js 可能是更好的选择?
- 添加更多文件(每天 80,000 个):这对 MongoDB 来说可能是个问题吗?
您 运行 遇到了 MongoDB 的内存池问题,以及如何控制它。这是根据您的系统以多种方式完成的。
然而,即使在此之前,您也是从 PHP 的角度来处理代码的。我认为您应该看一看并掌握 $aggregate $unwind 和其他类似的 MongoDB 数据操作函数。
建议:花一些时间了解和配置 mongod.conf 文件,并了解这些选项对您的系统意味着什么。然后花时间查看 Mongo 使用文档检索数据的方式之间的差异。
至于最好的语言mongo..你可能会得到很多答案。 Node.js 驱动程序由 Mongo 正式支持,并且 Mongo 从一开始就一直在使用 Node.js。 (认为 PHP To MySQL 与 Node.js To MongoDB 相同)。虽然我相信很多人会反对这个类比。
但作为一名 PHP 程序员,我绝不会想到将 PHP 与 Mongo 一起使用。据我在过去 2 年的观察和观察,Node 简直是 Mongo 的天然伙伴。
我是 MongoDB 的初学者,所以我有几个问题。首先我的代码是用PHP写的。我的使用上下文如下:
- 我在一个集合中存储了 80,000 个文档
- 每个文档都有这样的结构(Keys可以是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)
所以,从这个问题我有这个问题:
- 使用 MapReduce 可以避免这个问题吗?
- 我研究了一些使用 PHP 的 MapReduce 示例,但每个示例都使用了 MongoCode。通过一些研究,我发现 class MongoCode 已被弃用,而且别无选择。
- 有没有其他方法可以得到相同的结果(MongoDB\Driver)?
- PHP 是最适合使用的语言 MongoDB 吗? Node.js 可能是更好的选择?
- 添加更多文件(每天 80,000 个):这对 MongoDB 来说可能是个问题吗?
您 运行 遇到了 MongoDB 的内存池问题,以及如何控制它。这是根据您的系统以多种方式完成的。
然而,即使在此之前,您也是从 PHP 的角度来处理代码的。我认为您应该看一看并掌握 $aggregate $unwind 和其他类似的 MongoDB 数据操作函数。
建议:花一些时间了解和配置 mongod.conf 文件,并了解这些选项对您的系统意味着什么。然后花时间查看 Mongo 使用文档检索数据的方式之间的差异。
至于最好的语言mongo..你可能会得到很多答案。 Node.js 驱动程序由 Mongo 正式支持,并且 Mongo 从一开始就一直在使用 Node.js。 (认为 PHP To MySQL 与 Node.js To MongoDB 相同)。虽然我相信很多人会反对这个类比。 但作为一名 PHP 程序员,我绝不会想到将 PHP 与 Mongo 一起使用。据我在过去 2 年的观察和观察,Node 简直是 Mongo 的天然伙伴。