我已经在SO上看到了其他一些Mongo PHP $推问题,但由于某些原因,他们所说的都没有,所以我发布了自己的版本。
基本上,我正在尝试遵循10gen设定的指南,其中代表类似新闻提要或博客/评论帖的内容应该使用存储桶来完成 - 制作包含一定数量(50)事件的文档(评论等) 。),然后随着内容的增长创建多个文档。
我要做的是将文档($event
)推送到数组(events
),但是当文档不存在时,似乎与PHP有些混淆(upserting) 。我尝试使用插入操作,但插入和$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,但我一直在和这个人摔跤有一段时间,我无能为力。它正在举行我的整个项目,所以....>:/
答案 0 :(得分:1)
您的更新文档格式不正确,请尝试以下操作:
$historyDoc = array('_id' => $uID,
'count' => 1,
'$push' => array('events' => $event));
答案 1 :(得分:1)
这不是最优雅的解决方案,但它看起来很有效。显然在新文档上使用$push
是一个问题(插入或插入)(编辑:实际上可能是组合原子和非原子问题的问题。你不能在_id上使用原子操作符所以......)但是,您可以先插入文档然后更新/插入文档来解决它。
为了通过PHP在Mongo中初始化一个数组,你需要创建一个带有空数组和一个值的文档,如下所示:
$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"
}
]
}