【问题标题】:Mongodb PHP updated document passed as a parameter through ajax does not saveMongodb PHP更新文档通过ajax作为参数传递不保存
【发布时间】:2012-07-23 20:05:31
【问题描述】:

我在使用 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_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' (length=21) '代码' => int 10068 'n' => int 0 '最后一次' => 对象(MongoTimestamp)[8] 公共“秒”=> int 1343070014 公共'inc' => int 1 'connectionId' => int 56143 'ok' => 浮动 1

这 1.5 天我一直在用头撞墙。

任何 MongoDB 专家可以帮助我吗?

附:如果我只停留在 php 程序中,则查找和保存工作完美。 好像来回传递json的时候有问题。

【问题讨论】:

    标签: ajax json mongodb save parameter-passing


    【解决方案1】:

    通过将 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 操作)。

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 1970-01-01
      相关资源
      最近更新 更多