通过ajax作为参数传递的Mongodb PHP更新文档不保存

通过ajax作为参数传递的Mongodb PHP更新文档不保存,ajax,json,mongodb,save,parameter-passing,Ajax,Json,Mongodb,Save,Parameter Passing,我对使用PHP和Javascript的MongoDB有问题 1) 我写了一份文档到集合中,并验证它是否在那里 { "_id": ObjectId("500d9f072d854e2001000018"), "field1": "happenstance", "mydata": "balls grinders", "desc": "johnsig" } 2) 使用javascript,我通过调用php程序从集合中获取记录 function fetch(){ $.ajax(

我对使用PHP和Javascript的MongoDB有问题

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) 我修改了“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,所以我假设 这将简单地更新现有记录

相反,我得到了这个var_转储:

  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)
这是最后一个错误

排列 'err'=>string'无效运算符:$id'(长度=21) “代码”=>int 10068 'n'=>int 0 “lastOp”=> 对象(MongoTimestamp)[8] 公共“秒”=>int 1343070014 公共“公司”=>int 1 'connectionId'=>int 56143 “确定”=>float 1

我已经用这个把头撞到墙上1.5天了

任何MongoDB大师都能帮我吗

另外,如果我只停留在一个php程序中,那么查找和保存工作将非常完美。
前后传递json时似乎出现了问题。

通过将Mongo文档从PHP转换为json,您丢失了
\u id
字段的类型信息。在MongoDB的原生BSON中,这是一个。PHP表示与对象相同的类型,Mongo的JS外壳使用ObjectId类。在纯JSON中,没有类信息,因此它被表示为一个对象,其唯一的
$id
属性是一个字符串。您看到的错误消息是因为
$id
被解释为查询运算符

虽然这是ID字段带来的,但是在处理其他BSON类型(例如日期、时间戳、正则表达式模式)时,您可以看到相同的类型信息丢失。要立即解决此问题,可以手动将字段转换为PHP驱动程序提供的类

或者,我要说的是,没有理由将整个文档传回去进行编写。我建议研究backbone.js,它提供了模型属性。这将允许您在前端对文档建模,最小化发送回服务器的数据,并在Mongo中更新文档时利用原子更新(
$set
操作)