PHP ObjectId组有多个ID

时间:2014-07-11 02:20:21

标签: php arrays mongodb where

您好我有两个系列,其中一个是我关注的人,另一个是他们在Twitter和Facebook等社交网站上发布的内容。

以下集合包含每个用户的Feed集合_id的子数组,每个状态都有owner,并且具有ObjectId,其所有者与以下密钥相同这是一个例子

'_id' => new MongoId("REMOVED"),
  'following' => 
  array (
    '0' => 'ObjectId("53bf464ee7fda8780c8b4568")',
    '1' => 'ObjectId("53b00ab5e7fda8304b8b4567")',
  ),
  'owner' => new MongoId("53b9ea3ae7fda8863c8b4123"),

并在Feed中,您会看到以下

中的以下状态
array (
  '_id' => new MongoId("REMOVED"),
  'owner' => new MongoId("53bf464ee7fda8780c8b4568"),
  'status' => ' love this video - Pedigree Shelter dogs http://youtube.com/watch?v=5v5Ui8HUuN8',
  'timestamp' => new MongoDate(1405044327, 565000),
)

我遇到的问题是,虽然我可以逐个循环,但由于某种原因,我无法执行$或搜索我不太了解我是如何遍历以下数组并将其添加到搜索查询之前运行查询。

        collection = static::db()->feed;
        $where=array( '$or' => array(array('owner' => new MongoId($following.0)))));
        $feed = $collection->find($where);
        return $feed;

现在我明白我会以某种方式循环$where=array( '$or' => array(array('owner' => new MongoId($following.0)))));但我不是100%肯定如何做到这一点。

更新 根据下面的答案,我不得不编辑返回的数组 - 现在我只是手动工作,似乎无法让PHP脚本执行此操作

回答

Array ( [owner] => Array ( [$in] => Array ( [0] => new MongoId("53bf464ee7fda8780c8b4568") [1] => new MongoId("53b00ab5e7fda8304b8b4567") ) ) )

正确:

Array ( "owner" => Array ( '$in' => Array ( "0" => new MongoId("53bf464ee7fda8780c8b4568"), "1" => new MongoId("53b00ab5e7fda8304b8b4567") ) ) )

我不确定如何才能让它发挥作用。 当前的PHP

$collection = static::db()->following;
        $following = $collection->findOne(array ('owner' => new MongoId($_SESSION['user_information'][0]['_id'])));
        $follow = $following['following'];

        $collection = static::db()->feed;
        $where=array("owner" => array( '$in' =>$follow));
        print_r($where);
        $feed = $collection->find($where);
        print_r($feed);
        return $feed;

我已修复了该集合的一个小问题,现在返回数组显示

Array ( [owner] => Array ( [$in] => Array ( [0] => MongoId Object ( [$id] => 53bf464ee7fda8780c8b4568 ) [1] => MongoId Object ( [$id] => 53b00ab5e7fda8304b8b4567 ) ) ) )

然而我仍然无法让它像这样返回饲料

array (
  '_id' => new MongoId("53bf4667e7fda8700e8b4567"),
  'owner' => new MongoId("53bf464ee7fda8780c8b4568"),
  'status' => ' love this video - Pedigree Shelter dogs http://youtube.com/watch?v=5v5Ui8HUuN8',
  'timestamp' => new MongoDate(1405044327, 565000),
)
当我使用以下

时,

问题得到修复

var_dump(iterator_to_array($feed));

1 个答案:

答案 0 :(得分:0)

我在这里假设这只是一个PHP事物显示的方式,你的后续数组是一个实际的数组,而不是一个哈希/映射,通常在JSON表示中看起来像这样:

{ 
    "following": [
        ObjectId("53bf464ee7fda8780c8b4568"),
        ObjectId("53b00ab5e7fda8304b8b4567"),
    ],
    "owner": ObjectId("53b9ea3ae7fda8863c8b4123"),
}

在这种情况下"以下"已经是一个实际的数组,如果你只想.find()所有" feed"您所关注的人的项目,然后您只需将其传递给$in运算符以进行查询选择:

$where = array( "owner" => array( '$in' => $following ) );
$feed = $collection->find($where);
return $feed;

返回的光标将只包含来自"所有者"的Feed的结果。存在于您的"以下"来自其他收藏品的数组。


观看此代码:

$list = array(new MongoId(), new MongoId, new MongoId());
$doc = array( "owner" => array( '$in' => $list ));


echo json_encode( $doc, JSON_PRETTY_PRINT );

尽管通过此方法对JSON进行序列化,但等效的JSON是:

{
    "owner": {
        "$in": [
            ObjectId("53bf8157c8b5e635068b4567"),
            ObjectId("53bf8157c8b5e635068b4568"),
            ObjectId("53bf8157c8b5e635068b4569")
        ]
    }
}

这就是BSON序列化的方式,也是正确的查询。