2

我正在尝试使用 PHP 和 MongoDB 制作我的第一个应用程序。

我要做的是列出给定区域的果树,并且我还想列出可以在某个区域种植的果树。

我来自 MySQL 背景,所以如果在 sql 中,我会有一个包含树信息的树表。比我有一个实际的树表,它将与树表连接在一个 ID 上,并且还有位置和其他信息。

但是在 Mongo 中,我不确定这是如何完成的,或者应该如何完成。

我想要的是一个树列表,用户可以参考他们自己的树。

任何关于这将如何很棒的帮助或指导。

$db->trees->fruittrees
$db->tress->userstrees 

克里斯

4

3 回答 3

1

但是,您的问题中缺少很多东西:

我要做的是列出给定区域的果树,并且我还想列出可以在某个区域种植的果树。

闻起来像地理空间查询:http ://docs.mongodb.org/manual/core/geospatial-indexes/ 。

所以用户会有一个位置:

{
    name: 'sammaye',
    location: [107,206]
}

每棵正在生长的树都可以利用一系列区域:

{
    name: 'apple tree'
    locations_of_growth: [[74,59],[67,-45]]
}

您只需$near对用户进行与地球距离(http://docs.mongodb.org/manual/core/geospatial-indexes/#distance-calculation)相当的查询,即可计算出该用户附近存在哪些树木。

关于地理空间查询的问题是它们也可以通过进一步的信息来限制,所以假设你想让用户比较他们在该地区苹果树的叶子颜色,以找出该地区有多少苹果树有绿叶您可以简单地将其添加为树文档中的条件,并将其添加到您的$near.

地理空间查询有一个缺点,每个集合只能有一个索引(http://docs.mongodb.org/manual/core/geospatial-indexes/#create-a-geospatial-index)所以这个意味着如果您还希望提供可以在该区域种植的树木的列表,那么您可能需要两个集合,一个称为other_trees,一个称为growable_species。当您希望允许用户将他们的树与您查询的区域中的其他树进行比较other_trees时,并且当您希望允许用户查看您可以查询的区域中可以种植哪些树时growable_trees

这当然只是这样做的一种方式。

编辑

我不会“推荐”使用 Doctrine,这取决于您,这取决于您的情况。Doctrine 是一个非常沉重且速度惊人的 ORM,并且有很多更快、更轻量级的 PHP ORM:http://docs.mongodb.org/ecosystem/drivers/php-libraries/如果你想使用ORM 也就是说,也许你有一个完整的堆栈框架,或者你想单独使用驱动程序。

此外,MongoDB 不需要 JSON PHP(无论是什么)处理知识。来自 MongoDB 的所有结果作为 BSON 进入驱动程序,然后被反序列化为 PHP 中的标准字典,即关联数组。您在这里不需要 JSON PHP 处理知识。

与其他答案不同的是,对“将所有信息存储在单个 JSON 文档中”要非常谨慎,即因为 MongoDB 是 BSON 而不是 JSON,还因为应该非常仔细地考虑嵌入,并判断它是否适合您的场景. 实际上,您会发现_id在大多数情况下将 s 以外的任何内容嵌入到其他行可能会导致问题,但正如我所说,这取决于场景。

于 2013-02-19T08:18:41.003 回答
0

在 Mongo 中建模数据时,我经常发现这取决于您将如何在 UI 中使用数据。Mongo 不擅长进行连接(如您所知),但您仍然可以进行连接。您可以在中间层或 UI 中执行它们。

因此,对于您的示例,我可能会执行以下操作:

树集合中的一棵树:


{
   "_id" : 123,
   "name" : "Orange",
   "price" : 10,
   "climate" : "Any"
}

用户:


{
   "user" : "Bob",
   "selected_trees" : [ 123, 124, 156 ]
}

然后在您的 UI 中,您加载 Bob 并调用可用的树集合来为他获取树的详细信息。

还有一种常见的做法是实际将完整的树对象包含在用户中。你会对这个来自关系背景的想法感到厌恶,但这在 Mongo 中很常见。您到处都有相同数据的副本。这是正常和预期的。

于 2013-02-19T03:42:51.720 回答
0

MongoDB 是一个面向文档的数据库。这意味着您应该设计与在 MySQL 或其他关系数据库中使用的模型完全不同的模型。例如,如果您想存储用户信息(包括他们拥有的树),您应该将所有这些信息存储在一个 JSON 文档中。如需更多参考,请阅读

我还建议使用 Doctrine,它可以让您将对象存储到 MongoDB 中,因此对数据库进行建模会容易得多,您只需要创建一个代表对象的面向对象模型。请参考这个页面

为此,您将需要 JSON php 处理和面向对象编程方面的知识。在从使用 MySql 到 No-Sql 数据库的过渡开始时总是有帮助的一件事是对数据库进行建模,然后对表进行非规范化,这样您将知道需要放入对象/文档中的所有信息。

希望这可以帮助你

于 2013-02-19T03:37:07.370 回答