Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在MongoDB中交叉引用数据_Php_Mongodb_Mongodb Php - Fatal编程技术网

Php 如何在MongoDB中交叉引用数据

Php 如何在MongoDB中交叉引用数据,php,mongodb,mongodb-php,Php,Mongodb,Mongodb Php,我正在尝试使用PHP和MongoDB创建我的第一个应用程序 我想做的是列出一个特定区域内的果树,我还想列出一个区域内可以种植的果树 我来自MySQL的背景,所以如果在sql中,我会有一个树表,其中包含关于树的信息。然后我会有一个实际树的表,它会在IDs上与树表连接,还有位置和其他信息 然而,在Mongo,我不确定这是如何做到的,或者应该如何做到 我想要的是一个树列表,用户可以参考自己的树 任何关于这方面的帮助或指导都是很好的 $db->trees->fruittrees $db-&g

我正在尝试使用PHP和MongoDB创建我的第一个应用程序

我想做的是列出一个特定区域内的果树,我还想列出一个区域内可以种植的果树

我来自MySQL的背景,所以如果在sql中,我会有一个树表,其中包含关于树的信息。然后我会有一个实际树的表,它会在IDs上与树表连接,还有位置和其他信息

然而,在Mongo,我不确定这是如何做到的,或者应该如何做到

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

任何关于这方面的帮助或指导都是很好的

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

Chris

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

我还建议使用Doctrine,它允许您将对象存储到MongoDB中,因此对数据库建模要容易得多,您只需要创建一个表示对象的面向对象模型。请参阅

为此,您需要JSON php处理和面向对象编程方面的知识。在从使用MySql过渡到无Sql数据库的初期,有一件事总是很有帮助的,那就是对数据库和表进行建模,这样您就可以知道需要放入对象/文档中的所有信息


希望这对您有所帮助

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

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

树集合中的树:


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

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


另外一种常见的做法是实际将完整的树对象包含在用户中。你会厌恶这种来自关系背景的想法,但这在Mongo中很常见。你有相同数据的副本。这是正常的,也是意料之中的

然而,你的问题中缺少了很多东西:

我想做的是列出一个特定区域内的果树,我还想列出一个区域内可以种植的果树

闻起来像是地理空间查询:

因此,用户将有一个位置:

{
    name: 'sammaye',
    location: [107,206]
}
每棵正在生长的树都可以利用一系列区域:

{
    name: 'apple tree'
    locations_of_growth: [[74,59],[67,-45]]
}
您只需对用户执行一个与地球距离相当的
$near
查询()即可计算出该用户附近有哪些树木

地理空间查询的问题是,它们也可以被进一步的信息约束,因此,假设您想让用户比较该地区苹果树的叶子颜色,以了解该地区有多少苹果树有绿色叶子,您只需将其作为条件添加到树文档中,并将其添加到您的
$near

地理空间查询有一个缺点,即每个集合只能有一个索引(),这意味着如果您还希望提供可在该区域种植的树木列表,则可能需要两个集合,一个称为
其他_树
,另一个称为
可生长物种
。当您希望允许用户将其树与您查询的区域中的其他树进行比较时,以及当您希望允许用户查看该区域中可以生长的树时,您可以查询可生长的树

这当然只是一种方法

编辑 我不会“推荐”使用原则,这取决于你自己,取决于你的情况。Doctrine是一个非常沉重且速度惊人的ORM,还有很多更快、更轻量级的PHP ORM:如果你想使用ORM,也就是说,你可能有一个完整的堆栈框架,或者你想单独使用驱动程序

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


与其他答案不同的是,对于“将所有信息存储在一个JSON文档中”要非常谨慎,这是因为MongoDB不是基于JSON的,而是因为嵌入应该非常仔细地考虑,并且应该根据它是否适合您的场景来判断。事实上,您会发现在大多数情况下,在其他行中嵌入比
\u id
更多的内容可能会导致问题,但正如我所说的,这取决于场景。

我发现在mongodb中查询和更新子(或子子)集合非常困难。因此,如果我在一个子集合中有很多条目,我会创建一个单独的集合,更像在SQL中。这是错误的吗?我不认为,“…这在Mongo中很常见。你在所有地方都有相同数据的副本。这是正常的和预期的。”是良好的做法还是预期的。。。每一条规则都有例外,但是仅仅因为您使用的是Mongo,这是一个非常普遍的例外。
{
    name: 'apple tree'
    locations_of_growth: [[74,59],[67,-45]]
}