欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MongoDB執(zhí)行mongoexport時的異常及分析(數(shù)字類型的查詢)

 更新時間:2018年09月09日 15:06:26   作者:東山絮柳仔  
這篇文章主要給大家介紹了關(guān)于MongoDB執(zhí)行mongoexport時的異常及分析(數(shù)字類型的查詢)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

概述

mongoexport命令行用于數(shù)據(jù)的導(dǎo)出,默認導(dǎo)出的文件格式為JSON格式。當然也可以指定特定的文件格式。

語法

C:\mongo\bin>mongoexport -help
options:
  --help                  produce help message
  -v [ --verbose ]        be more verbose (include multiple times for more
                          verbosity e.g. -vvvvv)
  -h [ --host ] arg       mongo host to connect to ( <set name>/s1,s2 for sets)
  --port arg              server port. Can also use --host hostname:port
  --ipv6                  enable IPv6 support (disabled by default)
  -u [ --username ] arg   username
  -p [ --password ] arg   password
  --dbpath arg            directly access mongod database files in the given
                          path, instead of connecting to a mongod  server -
                          needs to lock the data directory, so cannot be used
                          if a mongod is currently accessing the same path
  --directoryperdb        if dbpath specified, each db is in a separate
                          directory
  -d [ --db ] arg         database to use
  -c [ --collection ] arg collection to use (some commands)
  -f [ --fields ] arg     comma separated list of field names e.g. -f name,age
  --fieldFile arg         file with fields names - 1 per line
  -q [ --query ] arg      query filter, as a JSON string
  --csv                   export to csv instead of json
  -o [ --out ] arg        output file; if not specified, stdout is used
  --jsonArray             output to a json array rather than one object per
                          Line

說明:

  • -h:數(shù)據(jù)庫宿主機的IP
  • -u:數(shù)據(jù)庫用戶名
  • -p:數(shù)據(jù)庫密碼
  • -d:數(shù)據(jù)庫名字
  • -c:集合的名字
  • -f:導(dǎo)出的列名
  • -q:導(dǎo)出數(shù)據(jù)的過濾條件
  • --csv:導(dǎo)出格式為csv 

引言

今天在用mongoexport導(dǎo)出滿足一定條件下的數(shù)據(jù)時,遇到了一個報錯,現(xiàn)紀錄下來,并且針對此錯誤對MongoDB 的 數(shù)字類型做了進一步的學(xué)習(xí)。

背景 及 報錯信息

今天接到一個業(yè)務(wù)需求,需要從MongoDB 數(shù)據(jù)庫 order集合中導(dǎo)出符合以下條件的數(shù)據(jù):

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

通過MongoDB 客戶端工具 【NoSQLBooster for MongoDB】查詢檢查,語句執(zhí)行正常,顯示相應(yīng)記錄數(shù)為 15265。

導(dǎo)出數(shù)據(jù)使用mongoexport命令,執(zhí)行命令如下:

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

但是執(zhí)行報錯:

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

錯誤截圖如下:

錯誤推斷及測試

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

結(jié)果將導(dǎo)出命令中的 NumberInt("21") 直接替換為 21 ,再次執(zhí)行。

執(zhí)行命令為 :

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

執(zhí)行結(jié)果為

結(jié)果表明修改后,數(shù)據(jù)成功導(dǎo)出。

錯誤解析與原理探究

為什么通過查詢器查看,數(shù)據(jù)就是 "Source" : NumberInt("21") ,但是在shell 中的執(zhí)行導(dǎo)出命令寫成"Source" : NumberInt("21") 就會報錯。而一定要轉(zhuǎn)換為"Source":21

查詢器查詢出的Source字段顯示:

明明就是"Source" : NumberInt("21") ,為什么復(fù)制到shell,執(zhí)行報錯???

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

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

在MongoDB客戶端可以執(zhí)行查詢,但是在shell中無法執(zhí)行導(dǎo)出,那么會不會和這兩種工具有關(guān)?會不會和插入的NumberInt(數(shù)字) 還是NumberInt('數(shù)字‘)有關(guān)?

下面對假設(shè)進行驗證測試。

通過 NoSQLBooster for MongoDB 方式 插入測試數(shù)據(jù)

通過 shell方式插入測試數(shù)據(jù)

通過$type 去查看插入的數(shù)據(jù)類型

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

以上查詢結(jié)果顯示,不管是通過客戶端還是shell,當數(shù)字不指明數(shù)據(jù)類型時,插入的數(shù)字數(shù)據(jù)默認都是Double。

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

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

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

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

以上的測試說明,當我們在存儲數(shù)字數(shù)據(jù)時會自動轉(zhuǎn)儲(不管什么客戶端工具,是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 認為我們把一個字符類型的數(shù)據(jù)傳給了 json.NumberInt 。

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

執(zhí)行命令為 :

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

執(zhí)行也成功。

結(jié)論

說了很多總結(jié)下:

執(zhí)行失敗的導(dǎo)出命令是:

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

執(zhí)行成功的導(dǎo)出命令是:

/data/mongodb/mongobin344/bin/mongoexport -h 172.X.X.XXX --port 端口 --db 數(shù)據(jù)庫 -u 賬號 -p '密碼' --authenticationDatabase 認證數(shù)據(jù)庫 --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 數(shù)據(jù)庫 -u 賬號 -p '密碼' --authenticationDatabase 認證數(shù)據(jù)庫 --type=csv -c qqwj_order -f MsgContent,REC_CreateTime -q '{"Source": NumberInt(21),"Batch":"支付中的訂單提醒:2018/9/5","MsgContent":/還未完成在線付款/}' -o /data/mongodb_back/sms.csv

三個導(dǎo)出命令不同的地方已用紅色字體標注。

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

舊版本(部分)的顯示

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

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

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • ?PostgreSQL?與MongoDB使用對比分析

    ?PostgreSQL?與MongoDB使用對比分析

    這篇文章主要介紹了為什么?PostgreSQL?能代替?MongoDB?,需要的朋友可以參考下
    2023-12-12
  • MongoDB創(chuàng)建用戶報錯command createUser requires authentication的解決方法

    MongoDB創(chuàng)建用戶報錯command createUser requires auth

    這篇文章主要介紹了MongoDB創(chuàng)建用戶報錯command createUser requires authentication的解決方法,文中通過代碼和圖文講解的非常詳細,對大家的解決問題有一定的幫助,需要的朋友可以參考下
    2024-09-09
  • MongoDB 查詢操作的實例詳解

    MongoDB 查詢操作的實例詳解

    這篇文章主要介紹了MongoDB 查詢操作的實例的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Windows下MongoDB配置用戶權(quán)限實例

    Windows下MongoDB配置用戶權(quán)限實例

    這篇文章主要介紹了Windows下MongoDB配置用戶權(quán)限實例,本文實現(xiàn)需要輸入用戶名、密碼才可以訪問MongoDB數(shù)據(jù)庫,需要的朋友可以參考下
    2015-01-01
  • windows安裝mongodb6.x并設(shè)置用戶名密碼的詳細過程

    windows安裝mongodb6.x并設(shè)置用戶名密碼的詳細過程

    這篇文章主要介紹了windows安裝mongodb6.x并設(shè)置用戶名密碼,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 分布式文檔存儲數(shù)據(jù)庫之MongoDB訪問控制的操作方法

    分布式文檔存儲數(shù)據(jù)庫之MongoDB訪問控制的操作方法

    這篇文章主要介紹了分布式文檔存儲數(shù)據(jù)庫之MongoDB訪問控制的操作方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 分布式文檔存儲數(shù)據(jù)庫之MongoDB分片集群的問題

    分布式文檔存儲數(shù)據(jù)庫之MongoDB分片集群的問題

    這篇文章主要介紹了分布式文檔存儲數(shù)據(jù)庫之MongoDB分片集群的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • MongoDB基礎(chǔ)命令以及操作示例詳解

    MongoDB基礎(chǔ)命令以及操作示例詳解

    Mongodb:是一種NoSQL數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于MongoDB基礎(chǔ)命令以及操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • mongodb字段值自增長實現(xiàn)代碼

    mongodb字段值自增長實現(xiàn)代碼

    這篇文章主要介紹了mongodb字段值自增長實現(xiàn),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • MongoDB特定類型的查詢語句實例

    MongoDB特定類型的查詢語句實例

    在關(guān)系型數(shù)據(jù)庫中,可以實現(xiàn)基于表的各種各樣的查詢,下面這篇文章主要給大家介紹了關(guān)于MongoDB特定類型查詢的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04

最新評論