【问题标题】:mongodb php $push not inserting arraymongodb php $push不插入数组
【发布时间】:2012-04-03 12:40:47
【问题描述】:

我在 SO 上看到了一堆其他 Mongo PHP $push 问题,但出于某种原因,他们所说的没有一个有效,所以我发布了我自己的版本。

基本上,我正在尝试遵循 10gen 设置的准则,在该准则中,应该使用存储桶来表示新闻提要或博客/评论文章之类的内容 - 制作包含一定数量 (50) 事件(cmets 等)的文档.),然后随着内容的增长创建多个文档。

我想要做的是将文档 ($event) 推送到一个数组 (events) 中,但是当文档不存在时(更新插入),PHP 似乎有些混乱。我试着用插入来做,但是插入和$push 不能很好地配合使用。

这是我现在拥有的:

$historyDoc = array('_id'=>$uID, 'count'=>1,
  array('$push' => array('events' => $event)));

$query = array('_id'=>$uID);

//add user to history
$collection->update($query,$historyDoc,
    array('safe'=>true,'timeout'=>5000,'upsert'=>true));

$event 是格式正确的数组(文档)(例如时间戳、用户 ID、操作、名称),$uID 是从另一个集合中获取的 MongoID 对象。

我得到的结果是这样的:

{
"_id": {
    "$oid": "4f77ec39fef97a3965000000"
    },
"0": {
    "$push": {
        "events": {
            "timestamp": 1333259321,
            "action": "achievement",
            "pts": 0,
            "name": "join"
        }
    }
},
"count": 1
}

这很好,因为我的文档至少显示正确,但是里面怎么会有一个带有“$”的键?这并不是说我没有逃脱$...出于这个确切原因,我一直非常专注地使用单引号。

也许我遗漏了一些东西,或者我破坏了 PHP,但我一直在努力解决这个问题,但我无能为力。它支撑着我的整个项目,所以....>:/

【问题讨论】:

    标签: php mongodb


    【解决方案1】:

    您的更新文档格式不正确,试试这个:

    $historyDoc = array('_id' => $uID, 
                        'count' => 1,
                        '$push' => array('events' => $event));
    

    【讨论】:

    • 以前试过那个。我刚刚又做了一次,这是我收到的错误消息:exception 'MongoCursorException' with message 'Modifiers and non-modifiers cannot be mixed' in /var/fog/apps/app34260/trinker.phpfogapp.com/php/register.php:190。我在 PHP Mongo 手册中的某个地方看到了一些看起来很有希望的东西,所以我会尝试一下。
    • 啊,确实,你不能混合这些。尝试将count 转换为$set。不过,你不能 $set_id
    • 我有一个解决方案,但愚蠢的 StackOverflow 不允许我再发布 7 个小时,因为我没有超过 100 个代表。像这样的时候,声誉系统适得其反。去你的,所以。请参阅:我的解决方案编辑
    【解决方案2】:

    这不是最优雅的解决方案,但看起来很有效。显然在新文档(插入或更新插入)上使用$push 存在问题(编辑:这实际上可能是结合原子和非原子事物的问题。你不能在_id上使用原子运算符,所以...)。但是,您可以通过先插入文档然后更新/更新它来解决它。

    为了通过 PHP 在 Mongo 中初始化一个数组,您需要创建一个带有空数组 a 值的文档,如下所示:

    $historyDoc = array('_id'=>$uID.'-0',
            'count'=>1, 
            'events'=>array());
    

    从那里,您可以简单地将要放入第一个索引的内容稍后插入:

    $collection->update($query, $historyDoc,
                 array('safe'=>true,'timeout'=>5000,'upsert'=>true));
    
    $collection->update($query,
                array('$push'=>array('events'=>$event)),
                array('safe'=>true,'timeout'=>5000,'upsert'=>true));
    

    这会产生如下形式的结果文档:

    {
    "_id": "4f77f307fef97aed12000000-0",
    "count": 1,
    "events": [
        {
            "timestamp": 1333261063,
            "action": "achievement",
            "pts": 0,
            "name": "join"
        }
    ]
    }
    

    来源:Mongo PHP Manual - Updates

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 2013-03-04
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多