MongoDB 執行mongoexport時異常及分析(關於數字類型的查詢)

来源:https://www.cnblogs.com/xuliuzai/archive/2018/09/06/9601266.html
-Advertisement-
Play Games

今天在用mongoexport導出滿足一定條件下的數據時,遇到了一個報錯,現紀錄下來,並且針對此錯誤對MongoDB 的 數字類型 做了進一步的學習。 背景 及 報錯信息 今天接到一個業務需求,需要從MongoDB 資料庫 order集合中導出符合以下條件的數據: db.qqwj_order.fin ...


今天在用mongoexport導出滿足一定條件下的數據時,遇到了一個報錯,現紀錄下來,並且針對此錯誤對MongoDB 的 數字類型 做了進一步的學習。

背景 及 報錯信息 

今天接到一個業務需求,需要從MongoDB 資料庫 order集合中導出符合以下條件的數據:

 

db.qqwj_order.find({"Source":NumberInt("21"),"Batch":"支付中的訂單提醒:2018/9/5","MsgContent":/還未完成線上付款/})

 

通過MongoDB 客戶端工具 【NoSQLBooster for MongoDB】查詢檢查,語句執行正常,顯示相應記錄數為 15265。

導出數據使用mongoexport命令,執行命令如下:

/data/mongodb/mongobin344/bin/mongoexport  -h 172.X.X.XXX --port 埠 --db 資料庫 -u 賬號 -p '密碼' --authenticationDatabase 認證資料庫 --type=csv -c qqwj_order -f MsgContent,REC_CreateTime  -q '{ "Source":NumberInt("21"),"Batch":"支付中的訂單提醒:2018/9/5","MsgContent":/還未完成線上付款/}' -o  /data/mongodb_back/sms.csv 

但是執行報錯:

XXX is not valid JSON: json: cannot unmarshal string into Go value of type json.NumberInt

錯誤截圖如下:

 

錯誤推斷及測試

 

因為報錯信息中NumberInt 關鍵字,此時去看我們的查詢條件正好也有此關鍵字,所以推測 是不是這個問題。

結果將導出命令中的 NumberInt("21") 直接替換為 21 ,再次執行。

執行命令為 :

/data/mongodb/mongobin344/bin/mongoexport  -h 172.X.X.XXX --port 埠 --db 資料庫 -u 賬號 -p '密碼' --authenticationDatabase 認證資料庫 --type=csv -c qqwj_order -f MsgContent,REC_CreateTime  -q '{"Source":21,"Batch":"支付中的訂單提醒:2018/9/5","MsgContent":/還未完成線上付款/}' -o  /data/mongodb_back/sms.csv

 

執行結果為

結果表明修改後,數據成功導出

錯誤解析與原理探究

 

為什麼通過查詢器查看,數據就是     "Source" : NumberInt("21"),但是在shell 中的執行導出命令寫成"Source" : NumberInt("21") 就會報錯。而一定要轉換為"Source":21

查詢器查詢出的Source欄位顯示:

明明就是 "Source" : NumberInt("21"),為什麼複製到shell,執行報錯???

 

回頭看,找原理。我們知道目前MongoDB 支持4中數據類型。

  • double
  • 32-bit integer
  • 64-bit integer
  • Decimal (New in version 3.4.)

 

在MongoDB客戶端可以執行查詢,但是在shell中無法執行導出,那麼會不會和這兩種工具有關?會不會和插入的NumberInt(數字) 還是NumberInt('數字‘)有關?

下麵對假設進行驗證測試。

通過 NoSQLBooster for MongoDB 方式 插入測試數據

通過 shell方式插入測試數據

 

通過$type 去查看插入的數據類型

 

1》執行db.numbers.find({n:{$type:1}})  // Type 為 Double;查詢Type 為 Double的數據

以上查詢結果顯示,不管是通過客戶端還是shell,當數字不指明數據類型時,插入的數字數據預設都是Double。

 

 2》執行命令 db.numbers.find({n:{$type:16}})  // Type 為 32-bit integer ;查詢Type 為 32-bit integer的數據

以上查詢表名,不管通過客戶端還是shell,指定的NumberInt(5) 還是NumberInt('5‘) 後臺都轉成統一32-bit integer 類型存儲了。

 

 3》執行命令 db.numbers.find({n:{$type:18}})  // Type 為 64-bit integer 查詢Type 為 64-bit integer的數據

 

以上查詢表名,不管通過客戶端還是shell,指定的NumberLong(5) 還是NumberLong('5') 後臺都轉成統一64-bit integer 類型存儲了。

 

以上的測試說明,當我們在存儲數字數據時會自動轉儲(不管什麼客戶端工具,是shell還是 【NoSQLBooster for MongoDB】,不管 NumberLong(5) 還是NumberLong('5');NumberInt(5) 還是NumberInt('5‘))。

 

有點糊塗了吧? 如此這樣,那為什麼 在查詢是報錯呢?

回頭再看錯誤提示:XXX is not valid JSON: json: cannot unmarshal string into Go value of type json.NumberInt

其意思是shell 認為我們把一個字元類型的數據傳給了 json.NumberInt。

那我如果將導出命令中的 NumberInt("21") 將 換成 NumberInt(21)

執行命令為 :

/data/mongodb/mongobin344/bin/mongoexport  -h 172.X.X.XXX --port 埠 --db 資料庫 -u 賬號 -p '密碼' --authenticationDatabase 認證資料庫 --type=csv -c qqwj_order -f MsgContent,REC_CreateTime  -q '{"Source": NumberInt(21),"Batch":"支付中的訂單提醒:2018/9/5","MsgContent":/還未完成線上付款/}' -o  /data/mongodb_back/sms.csv 

執行也成功。

結論

說了很多總結下:

執行失敗的導出命令是:

/data/mongodb/mongobin344/bin/mongoexport  -h 172.X.X.XXX --port 埠 --db 資料庫 -u 賬號 -p '密碼' --authenticationDatabase 認證資料庫 --type=csv -c qqwj_order -f MsgContent,REC_CreateTime  -q '{ "Source":NumberInt("21"),"Batch":"支付中的訂單提醒:2018/9/5","MsgContent":/還未完成線上付款/}' -o  /data/mongodb_back/sms.csv 

執行成功的導出命令是:

/data/mongodb/mongobin344/bin/mongoexport  -h 172.X.X.XXX --port 埠 --db 資料庫 -u 賬號 -p '密碼' --authenticationDatabase 認證資料庫 --type=csv -c qqwj_order -f MsgContent,REC_CreateTime  -q '{"Source":21,"Batch":"支付中的訂單提醒:2018/9/5","MsgContent":/還未完成線上付款/}' -o  /data/mongodb_back/sms.csv

和 

/data/mongodb/mongobin344/bin/mongoexport  -h 172.X.X.XXX --port 埠 --db 資料庫 -u 賬號 -p '密碼' --authenticationDatabase 認證資料庫 --type=csv -c qqwj_order -f MsgContent,REC_CreateTime  -q '{"Source": NumberInt(21),"Batch":"支付中的訂單提醒:2018/9/5","MsgContent":/還未完成線上付款/}' -o  /data/mongodb_back/sms.csv 

三個導出命令不同的地方已用紅色字體標註。

 

P.S  1  :後來作者深究了一下,為什麼同樣的查詢,通樣的查詢結果,有的顯示  "n" : 5  ; 有的顯示 "n" : NumberInt("5")。嘻嘻 》》》》版本不同而已。

舊版本(部分)的顯示

新版本(例如nosqlbooster4mongo-4.7.1)的顯示

P.S  2  :在存儲數字數據時,到底會存儲為何種數據類型,其實和語言的的驅動有關。例如在Ruby 和 Python 語言里在序列化整數時,驅動會自動確定是否編碼為32-bit integer 還是 64-bit integer;shell 需要顯示指定才可以。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第1章 NFS介紹 1.1 NFS基本概述 NFS(Network File System)網路文件系統 主要功能是通過區域網絡讓不同的主機系統之間可以共用文件或目錄。 NFS(Network File System)網路文件系統 NFS系統和Windows網路共用、網路驅動器類似, 只不過wind ...
  • 快速啟動是首先在Windows 8中實現並延續到Windows 10的功能,可在啟動PC時提供更快的啟動時間。它是一個方便的功能,也是大多數人在不知情的情況下使用的功能,但還有一些功能會在他們掌握新PC時立即禁用它。 什麼是快速啟動? Windows PC通常以多種高級配置和電源介面(ACPI)電源 ...
  • 在Microsoft Edge中,當您打開多個選項卡時,瀏覽器將顯示“您要關閉所有選項卡嗎?” 警告,以防止您意外關閉重要標簽。 通常,在沒有第二個想法的情況下,您會立即禁用此功能,檢查提示中的“始終關閉所有選項卡”選項。唯一需要註意的是,Edge不包含重新啟用消息的設置,如果以後,您會發現它是您需 ...
  • 我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 】 本文介紹X-CTR100控制器與樹莓派Linux系統組成機器人平臺。首先介紹與樹莓派串口通信,後介紹機器人平臺搭建。這種上下位機平臺架構常用於機器人RO... ...
  • 一、環境準備 系統:centos7 and centos6.8 172.16.1.11 二、開始安裝 安裝yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 安裝epe ...
  • 1.下載 2.解壓 3.重命名 4.編譯 有可能會出現 那就去安裝 成功了 安裝PHP-redis擴展 1.下載 2.解壓 3.找到phpize文件,生成配置 在redis-4.0.2文件夾中執行 4.配置 這個時候會報一些錯誤,打開php.ini 去除shell_exec,proc_open 5. ...
  • 文中部分內容摘自駿馬金龍的博客,查看可 "點擊" 1. crontab簡述 crontab命令用於周期性的執行任務,想要執行這個命令,需要首先啟動crond(守護進程)服務才行 crontab是配置管理crontab file的功程式,也可以移除或列出用於為 cron 提供服務的現有表項 cront ...
  • oracle net manager來加密客戶端與資料庫之間或中間件與 資料庫之間的網路傳輸數據 第一步:開始 所有程式 oracle 配置和移植工具 net Manager 第二步:選擇本地 概要文件 oracle高級安全性 SSL選項卡選擇客戶機或伺服器 第三步:進入加密選項卡,選擇或填寫加密類 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...