PHP - 可迭代对象问题

时间:2014-10-08 17:24:03

标签: php mongodb object elasticsearch

我正在开发一个网站,我们的系统管理员可以选择是否选择从mongodb或elasticsearch中检索我们的数据。我可以设置好,但我想设置一个开关案例,将根据站点管理部分中的首选项选择正确的文档检索系统。当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(让我们称之为$ count),我怎样才能将它转换为stongClass对象,就像mongo返回的那样,这样我就可以直接迭代通过类获取每个项的值,以及调用一个方法count()来检索计数?我想这样做,这样我就可以轻松地在两个数据对象之间切换而无需完全独立的函数处理同样的任务。

1 个答案:

答案 0 :(得分:0)

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

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

您将有两个转换功能,用于翻译MongoDB& ElasticSearch返回此对象的值。将来如果需要添加新字段,则需要相应地更新转换函数。如果添加了新的文档服务器,您只需编写转换函数,因为DocumentItem类已经定义良好。