2012-04-01 58 views
2

我見過一堆其他Mongo PHP $推送到這裏的問題,但由於某種原因,他們所說的沒有一個工作,所以我張貼我自己的版。

基本上,我試圖遵循的準則通過10gen的代表在那裏像一個新聞源或博客/留言後應該用桶來完成設置 - 讓持有事件的一定數量(50)的文件(意見,等等),然後隨着內容的增長創建多個文檔。

我想要做的是將文檔($event)推送到一個數組(events),但是當文檔不存在時(upserting),似乎與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,但我一直在摔跤這個一段時間,沒有什麼我可以做的。它牽着我的整個項目了,所以....>:/

您更新文檔中形成不良的

回答

1

它不是最完美的解決方案,但它看起來像它的工作原理。顯然在使用$push時出現了一個問題(插入或插入)(編輯:它可能實際上是將原子和非原子的東西結合起來的問題,你不能在_id上使用原子操作符,所以.. )。但是,您可以通過先插入文檔然後更新/插入它來避開它。

爲了通過PHP來初始化蒙戈一個數組,你需要創建一個空數組AA值的文件,如下所示:

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

從那裏,你可以簡單地把你要去什麼裝進第一索引和後來UPSERT它:

$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

1

,試試這個:

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

試過之前。我只是做了一遍,這裏是我得到的錯誤消息:異常'MongoCursorException'與消息'修飾符和非修飾符不能混合'在/var/fog/apps/app34260/trinker.phpfogapp.com/php/register .PHP:190'。我在PHP Mongo手冊中看到了一些看起來很有前途的東西,所以我會嘗試一下。 – 2012-04-01 06:16:18

+0

啊,的確,你不能混合這些。嘗試將'count'轉換爲'$ set'。不過,你不能'設置'_id'。 – 2012-04-01 06:19:36

+0

我有一個解決方案,但愚蠢的StackOverflow不會讓我發佈另外7個小時,因爲我沒有超過100個代表。像聲譽系統反彈的時代就是這樣的時代。擰你,SO。請參閱:我的編輯解決方案 – 2012-04-01 06:24:53