2012-07-23 68 views
1

我在使用PHP和Javascript的MongoDB時遇到問題。通過ajax作爲參數傳遞的Mongodb PHP更新文檔不保存

1)我向集合寫出一個文檔並確認它在那裏。

{ 
    "_id": ObjectId("500d9f072d854e2001000018"), 
    "field1": "happenstance", 
    "mydata": "balls grinders", 
    "desc": "johnsig" 

}

2)使用JavaScript我通過調用一個PHP程序獲取從集合中的記錄。

function fetch(){ 
    $.ajax({ 
     url: "sbugger.php", 
    dataType: "json", 
    data: "mode=fetch", 
    success: function(data){   
     record = data; 
    } 
}); 

}

3)I修改 「desc」 的元件,並通過將其返回到php程序

function save(){ 
record.desc=" HELLO THERE FELLA"; 
jString = encodeURIComponent(JSON.stringify(record)); 
myData = "mode=save&record="+jString; 
url = "sbugger.php"; 

$.ajax({ 
    url: url, 
    type: 'POST', 
    data: myData, 
    success: function(data){ 
     document.write(data); 
     } }); 

} 

在PHP端的代碼保存文檔是:

$stuff = json_decode($_REQUEST["record"],true); 
$collection->save($stuff); 

var_dump($stuff); 
var_dump($db->lastError()); 

因爲我沒有修改$ id我認爲 這隻會更新記錄d到位。

相反,我得到這個的var_dump:

object(stdClass)[4] 
    public '_id' => 
    object(stdClass)[5] 
    public '$id' => string '500d9f072d854e2001000018' (length=24) 
    public 'field1' => string 'happenstance' (length=12) 
    public 'mydata' => string 'balls grinders' (length=15) 
    public 'desc' => string ' HELLO THERE FELLA' (length=18) 

這lastError味精

陣列 'ERR'=>字符串 '無效操作者:$ ID'(長度= 21) '代碼'= >內部10068 'N'=> INT 0 'lastOp'=> 對象(MongoTimestamp)[8] 公共 '秒'=> INT 1343070014 公共 'INC'=> INT 1 '的ConnectionId'=> INT 56143 'ok'=>浮點數1

我一直在用這個擊打我的頭靠着牆1.5天。

任何MongoDB專家都可以幫助我嗎?

P.S.如果我仍然只是在一個PHP程序中找到並完美保存工作。 似乎當傳遞json來回有一個問題。

回答

0

通過將Mongo文檔從PHP轉換爲JSON並返回,您丟失了_id字段的類型信息。在MongoDB的本地BSON中,這是一個object ID。 PHP表示與MongoId對象相同的類型,Mongo的JS shell使用ObjectId類。在純JSON中,沒有類信息,所以這被表示爲只有$id屬性的字符串。您看到的錯誤消息是因爲$id被解釋爲查詢運算符。

雖然這提出了ID字段,但在處理其他BSON類型(例如日期,時間戳,正則表達式)時,您可能會看到類型信息的丟失。要立即解決這個問題,您可以手動將字段轉換爲由PHP驅動程序提供的類。

或者,我說真的沒有理由要整個文檔傳回的寫作。我會建議研究backbone.js,它爲模型屬性提供change detection。這將允許您在前端對文檔建模,最小化發送回服務器的數據,並在Mongo中更新文檔時利用原子更新($set操作)。