我在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手册-更新