3

我正在学习 MongoDB,并希望因为存储在 MongoDB 数据库中的数据格式与 JSON 非常相似,所以我能够直接从 jQuery 的getJSON()方法查询 MongoDB。

但是,我正在学习,您似乎需要 MongoDB 和 adriver才能从应用程序访问数据库。所以我暂时使用PHP驱动程序。

我正在尝试返回valuecontent字段:

MongoDB 文档

{
   "_id": ObjectId("34576347347"),
   "content": "here is some content",
   "field2": {
     "subfield1": {
       "0": "sf1v0",
       "1": "sf1v1",
       "2": "sf1v2" 
    },
     "subfield2": "value 2" 
  },
   "field2": "value 3" 
}

PHP

<?php 

$dbhost = 'username:password@127.x.xx.x:27017/';
$dbname = 'dbname';
$m = new MongoClient("mongodb://$dbhost");
$db = $m->$dbname;
$collection = $db->myCollection;
$query = $collection->find(array("field2.subfield2" => "value 2"));

header("Content-type: application/json");
echo json_encode($query);

?>

jQuery

$.getJSON("http://path/to/mongo.php", {cid: href, format: 'json'}, function(results){  
$("#my_div").html(results[0].content);
}

我想我需要“得到”一些东西:

  1. PHP 查询返回的内容:

    $query = $collection->find(array("field2.subfield2" => "value 2"));
    

    我认为 MongoDB 术语它正在返回cursor,但它是 PHP 数组,还是 JSON 数据或其他东西?

  2. getJSON()在代码中返回所需数据的正确“调用”是什么?

    目前 Firebug 正在向我展示:

    TypeError: results[0] is undefined
    

更新

我将getJSON()代码更改为:

$("#my_div").html(results.content);

现在我没有收到错误,而是来自 Firebug 的以下内容:

响应选项卡显示:{}

JSON 选项卡显示:没有要显示此对象的属性。

4

1 回答 1

2

您想将从find()函数返回的光标转换为 json_encode 可以实际使用的东西,如下所示:

$cursor = $collection->find(array("field2.subfield2" => "value 2"));
echo json_encode(iterator_to_array($cursor, false));

这是因为在您迭代游标之前查询不会运行。iterator_to_array 基本上会耗尽游标,获取所有文档,并将它们放入一个数组中供 json_encode 使用。

编辑

指定false为第二个$use_keys参数iterator_to_array()将确保结果按数字索引(而不是按_id每个文档的字段)。

于 2013-09-04T13:52:30.517 回答