Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb php$push不插入数组_Php_Mongodb - Fatal编程技术网

mongodb php$push不插入数组

mongodb php$push不插入数组,php,mongodb,Php,Mongodb,我在这里看到了很多其他Mongo PHP$推送问题,但由于某些原因,他们所说的都不起作用,所以我发布了自己的版本 基本上,我正试图遵循10gen制定的指导原则,即应该使用bucket来表示新闻提要或博客/评论文章——制作包含一定数量(50)的事件(评论等)的文档,然后随着内容的增长创建多个文档 我试图做的是将文档($event)推送到一个数组(events)中,但是当文档不存在时(升级),PHP似乎有些混乱。我试着用insert来做,但是insert和$push不能很好地配合 以下是我现在拥有的

我在这里看到了很多其他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中初始化数组,您需要创建一个带有空数组值的文档,如下所示:

$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"
    }
]
}

来源:

以前试过这个。我又做了一次,下面是我收到的错误消息:
exception'MongoCursorException'和消息'Modifiers和non-Modifiers不能混合在/var/fog/apps/app34260/trinker.phpfogapp.com/php/register.php:190
中。我在PHP Mongo手册的某个地方看到了一些看起来很有希望的东西,所以我要尝试一下。啊,事实上,你不能把它们混在一起。尝试将
count
转换为
$set
。但是,你不能
$set
一个
\u id
。我有一个解决方案,但愚蠢的StackOverflow不会让我再发布7个小时,因为我没有超过100个代表。在这种情况下,声誉系统会适得其反。去你的,所以。请参阅:我的编辑解决方案