2011-11-11 73 views
3

試圖在mongoexport中使用查詢會導致錯誤。但是相同的查詢由mongo-client評估,沒有錯誤。mongoexport JSON解析錯誤

在蒙戈客戶端:

db.listing.find({"created_at":new Date(1221029382*1000)}) 

與mongoexport:

mongoexport -d event -c listing -q '{"created_at":new Date(1221029382*1000)}' 

所生成的錯誤:

Fri Nov 11 17:44:08 Assertion: 10340:Failure parsing JSON string near: 
$and: [ { 
0x584102 0x528454 0x5287ce 0xa94ad1 0xa8e2ed 0xa92282 0x7fbd056a61c4 
0x4fca29 
mongoexport(_ZN5mongo11msgassertedEiPKc+0x112) [0x584102] 
mongoexport(_ZN5mongo8fromjsonEPKcPi+0x444) [0x528454] 
mongoexport(_ZN5mongo8fromjsonERKSs+0xe) [0x5287ce] 
mongoexport(_ZN6Export3runEv+0x7b1) [0xa94ad1] 
mongoexport(_ZN5mongo4Tool4mainEiPPc+0x169d) [0xa8e2ed] 
mongoexport(main+0x32) [0xa92282] 
/lib/libc.so.6(__libc_start_main+0xf4) [0x7fbd056a61c4] 
mongoexport(__gxx_personality_v0+0x3d9) [0x4fca29] 
assertion: 10340 Failure parsing JSON string near: $and: [ { 

但這樣做在Date乘法預先在mongoexport:

mongoexport -d event -c listing -q '{"created_at":new Date(1221029382000)}' 

作品!

爲什麼mongo在這兩種情況下對查詢進行不同的評估?

+0

當我用1221029382000替換1221029382 * 1000時問題消失。這是一個錯誤嗎? – Raphael

+1

在我看來,mongoexport無法評估計算,比如你的乘法。不能自己測試它,而是用一個帶有乘法或其他計算的簡單查詢來測試它。 – hellectronic

+0

這可能是真的,但那是一個錯誤。爲什麼客戶端不同於mongoexport處理JSON查詢? – Raphael

回答

8

mongoexport命令行實用工具支持通過查詢在JSON格式,但您要評估在查詢JavaScript

JSON格式最初是從JavaScript的對象表示法派生而來的,但是JSON文檔的內容可以在沒有使用JavaScript解釋器的情況下解析。

你應該考慮JSON作爲代表「結構化數據」和JavaScript爲「可執行代碼」。實際上,對於正在運行的查詢,有兩種不同的上下文。

mongo命令行實用程序是一個interactive JavaScript shell,它包括一個JavaScript解釋器以及一些用於MongoDB的輔助函數。雖然JavaScript對象格式與JSON類似,但您也可以使用JavaScript對象,函數調用和運算符。

1221029382*1000的示例是數學運算的結果,如果您在mongo shell中運行該運算,該運算將由JavaScript解釋器執行;在JSON中,對於新日期來說這是一個無效值,所以mongoexport正在退出,並顯示「Failure parsing JSON string」錯誤。

+0

謝謝你的解釋。非常感激! – Raphael

0

我也有這個錯誤做mongoexport,但出於不同的原因。我會在這裏分享我的解決方案,但是因爲我試圖解決我的問題而結束了這個SO頁面。

我知道它與這個問題沒什麼關係,但是這篇文章的標題將它引入了Google,所以既然我得到了完全相同的錯誤,我會添加一個答案。希望它可以幫助某人。

我試圖在Windows控制檯中執行MongoId _id查詢。問題是我需要在double引號中包裝JSON查詢,並且ObjectId 必須用雙引號(而不是單個!)。所以我不得不逃避ObjectId引號。

mongoexport -u USERNAME -Ppassword -d DATABASE -c COLLECTION --query 「{_id:物件(\」 5148894d98981be01e000011 \ 「)}」

如果我換在單引號Windows上的JSON查詢,我得到這個錯誤:

ERROR: too many positional options 

如果我周圍使用的ObjectId單引號,我得到這個錯誤:

Assertion: 10340:Failure parsing JSON string near: _id 

所以,是的。祝你好運。