【问题标题】:PHP - Iterable Object IssuePHP - 可迭代对象问题
【发布时间】:2014-12-03 11:04:17
【问题描述】:

我正在开发一个网站,我们的系统管理员可以在该网站上选择是否选择从 mongodb 或 elasticsearch 检索我们的数据。我可以很好地设置两者,但我想设置一个 switch case,它将根据站点管理部分中的首选项选择正确的文档检索系统。当 mongo 返回一个 stdClass 对象时,我可以遍历该对象以使用以下内容打印每个项目:

foreach($items as $item)
{
    print_r($item);
}

然后我可以使用 $items->count() 检索返回项目的总数。但是,当使用 elasticsearch 时,我返回了一个我需要去的对象:

foreach($items['hits']['hits'] as $item)
{
    print_r($item);
}

可以使用 $items['hits']['total'] 检索计数。如果我从elasticsearch返回的数据中提取项目数组(我们称之为“$finalitems”和计数(我们称之为$count),我怎样才能将它转换为像mongo返回的stdClass对象,以便我可以直接迭代通过类来获取每个项目的值,以及调用将检索计数的方法 count()?我想这样做,以便我可以轻松地在两个数据对象之间切换,而无需完全独立的函数处理同样的任务。

【问题讨论】:

  • print_r($items); 在第二种情况下的输出是什么?如果您要返回一个对象,那么这样的数组表示法将不起作用。

标签: php mongodb object elasticsearch


【解决方案1】:

出于多种原因,我不建议将 ElasticSearch 结果转换为 MongoDB 结果(反之亦然)。一个是即使现在感觉如果将它们都作为同一个对象会更容易,但将来可能需要使用/操作更多字段,这可能会成为一场噩梦。

一种解决方案是您创建一个新类,例如DocumentItem,并将MongoDBElasticSearch 结果都转换为此类。这样,您的代码中操作、迭代、对MongoDBElasticSearch 的返回值执行其他操作的部分将使用DocumentItem 对象,使用其定义的方法。

您将有两个转换函数用于将MongoDBElasticSearch 返回值转换为该对象。将来如果需要添加新字段,您将需要相应地更新转换函数。而如果增加了一个新的文档服务器,你只需要编写转换函数,因为DocumentItem类已经定义好了。

【讨论】:

  • 感谢您的解释。我认为你在这里提出了一个很好的观点,我会尝试走这条路。
  • @user2694306 - 很高兴为您提供帮助,如果您在创建转换函数时遇到问题,我相信 SO 中有很多人可以提供帮助!您应该首先定义 DocumentItem 类的外观,它需要哪些函数/变量,然后开始编写转换函数以满足该目标。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 2019-06-21
  • 2022-01-06
  • 1970-01-01
  • 2011-08-12
相关资源
最近更新 更多