2012-07-23 65 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操作)。