mongodb-php$push未插入数组


mongodb php $push not inserting array

我在SO上看到了很多其他Mongo PHP$推送问题,但出于某种原因,他们说的都不起作用,所以我发布了自己的版本。

基本上,我试图遵循10gen制定的一条准则,即应该使用bucket来表示新闻提要或博客/评论文章之类的内容——制作包含一定数量(50)的事件(评论等)的文档,然后随着内容的增长创建多个文档。

我想做的是将文档($event)推送到一个数组(events)中,但当文档不存在时,PHP似乎会出现一些混乱(混乱)。我试着用insert来做,但insert和$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,但我已经和这个问题斗争了一段时间,我无能为力。它阻碍了我的整个项目,所以….>:/

您的更新文档格式不正确,请尝试以下操作:

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

这不是最优雅的解决方案,但看起来很有效。显然,在新文档上使用$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手册-更新