【问题标题】:PHP ObjectId group a number of IdsPHP ObjectId 分组多个 Id
【发布时间】:2014-07-11 02:20:21
【问题描述】:

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

以下集合具有每个用户的提要集合的_id 的子数组,每个状态具有单词owner 并且具有所有者的ObjectId,与以下键相同这里是一个示例

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

在提要中你会看到下面的following.0状态

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),
)

我遇到的问题是,虽然我可以逐个循环,但由于某种原因无法进行 $or 搜索查询。

        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));

【问题讨论】:

    标签: php arrays mongodb where


    【解决方案1】:

    我在这里假设这只是显示事物的方式的 PHP 主义,并且您的以下数组是实际数组而不是哈希/映射,在 JSON 表示中通常看起来像这样:

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

    在这种情况下,“关注”已经是一个实际的数组,如果您只想 .find() 为您关注的人提供所有“供稿”项目,那么您只需将其传递给 $in 运算符您的查询选择:

    $where = array( "owner" => array( '$in' => $following ) );
    $feed = $collection->find($where);
    return $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 将如何序列化并且是正确的查询。

    【讨论】:

    • 小问题好像ObjectId不正确应该是MongoId
    • @RussellHarrower JSON 语法与它在 shell 中出现的一样。我确实明确说过。我试图区分 PHP 数据结构的可视化和世界其他地方如何看待它们。重点是,“这实际上是一个 real 数组吗?”还是我们其他人所说的“哈希”或“地图”或“字典”或其他什么?
    • 这是我用上述方法解决的问题 - 它返回 Array ( [owner] => Array ( [$in] => Array ( [0] => new MongoId("53bf464ee7fda8780c8b4568" ) [1] => new MongoId("53b00ab5e7fda8304b8b4567") ) ) ) 但是当它尝试将其作为 $where 查询运行时它不起作用 - 它需要是“所有者”而不是 [所有者] 以及其他键零件 - 任何建议
    • 请看问题我已经添加了我得到的错误
    • @RussellHarrower 我认为你误解了这一点。我已经为给出的代码添加了 BSON 序列化以清除它。
    猜你喜欢
    • 2020-07-23
    • 2016-10-19
    • 2015-11-18
    • 1970-01-01
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多