2011-11-28 43 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"。)

相關問題