2011-11-28 21 views
2

我想从javascript控制台到我的PHP应用程序的MongoDB查询。我试图避免的是必须将查询转换为PHP“本地驱动程序”的格式...我不想手动构建数组和手链函数比我想要手动构建数组MySQL的内部查询结构只是为了获取数据。如何在PHP中执行MongoDB控制台式查询?

我已经有一个字符串产生的蒙戈控制台的确切内容我想:

db.intake.find({"processed": {"$exists": "false"}}).sort({"insert_date": "1"}).limit(10); 

的问题是,有没有办法让我的手这个字符串,按原样对MongoDB的和有它用我请求的数据集返回一个游标?

现在我在“编写你自己的解析器,因为它不是有效的json,有点儿把有效的Mongo查询转换成PHP本地驱动程序想要的格式”,这不是很有趣。

我不想要一个ORM或一个大型的包装库;我只是想给我的查询字符串,因为它存在于控制台中,并得到一个我可以使用的迭代器。我知道有一些基于PHP的Mongo管理器应用程序显然会采用控制台式查询并处理它们,但是最初浏览他们的代码时,我不确定他们是如何处理翻译的。

我绝对喜欢在控制台蒙戈的工作,但我很快开始厌恶每一个查询转换为本土作家想要的格式的想法...

+0

fyi;这将会慢得多.. – Petrogad

回答

14

我不想手工打造阵列和手链功能...

你的shell代码充满“手打字典”“手链功能”。所有这些点都是链接函数,所有的JSON代表字典/散列表。

让我们做一个快速的比较。

的Javascript:

db.intake 
    .find({"processed": {"$exists": false}}) 
    .sort({"insert_date": "1"}) 
    .limit(10); 

PHP:

db->intake 
    ->find(array('processed'=> array('$exists'=> false))) 
    ->sort(array('insert_date'=> '1')) 
    ->limit(10); 

所以我基本上取代

  • “点” 与 “箭头”
  • “冒号”与“双箭头”
  • “左括号”与“阵列(”
  • “右括号”与“)”

这听起来像你在PHP真的生气了。我可以理解,PHP可以是一种懒惰的语言。但是,对于MongoDB PHP驱动程序,其语法与“原始”JavaScript相比尽可能接近人为。

+0

我喜欢你的'转换规则'。用于在shell中测试查询并在抛光时将它们移动到PHP脚本。 – Henry

+3

最好不要在查询中使用双引号。 “$存在”,“$不”,“$ nin”等,因为PHP试图尝试评估它作为一个变量的第一位。用单引号编写更好。 – risyasin

+0

但是为什么在查询Mongo时不能使用数组文字?似乎有点奇怪。 – Alper

0

MongoDB::execute应该让你运行任何JavaScript代码,但不幸的是会返回字符串,所以您只需要使用JavaScript实际迭代数据集。

>> $d = new Mongo 
Mongo::__set_state(array(
    'connected' => true, 
    'status' => NULL, 
    'server' => '', 
    'persistent' => NULL, 
)) 
>> $db = $d->database; 
MongoDB::__set_state(array(
    'w' => 1, 
    'wtimeout' => 10000, 
)) 
>> $db->execute('db.intake.find({"processed": {"$exists": "false"}}).sort({"insert_date": "1"}).limit(10);'); 
array (
    'retval' => 
    array (
    'value' => 'DBQuery: database.intake -> undefined', 
), 
    'ok' => 1, 
) 
2

你可以使用json_decode()仍然有效地完成查询(使用MongoDB::execute效率不高),并得到光标回。例如,

$db->intake->find(json_decode('{"processed": {"$exists": "false"}}')) 
    ->sort(json_decode('{"insert_date": "1"}'))->limit(10); 

不知道这是否比使用关联数组更好,但它是一个选项。这样你只需要看“JSON”查询语法。

(另外,我想你的意思$exists:false,不$exists:"false"。)

相关问题