2014-06-14 18 views
0

我試着做MongoDB中類似於SQL例子查詢:「類似」 SQL MongoDB中對數運算

SELECT * from example where contactphone like '4832%'; 

我的第一個想法是做類似:

db.example.find({ contactphone: /^4832/ }) 

但不會返回我正在尋找的東西,因爲聯繫電話是一個數字。

有什麼好的做法 - 在mongodb上做數字操作的方法嗎?

編輯:電話號碼可能是一個壞榜樣。可以說我需要找到包含數字的所有數字9.我怎樣才能達到目的?

+2

如果您需要'LIKE'操作,我建議將電話號碼存儲爲字符串。這也將允許具有前導零的國際號碼,例如'011468 ...'。也就是說,如果你有一個固定的數字位數,你可以使用'$ gt'和'$ lt'。 –

+1

當你有一個算術無意義的數字時 - 比如郵政編碼,社會安全號碼或電話號碼 - 你應該總是把它作爲一個字符串存儲起來,而不是整數。 – Philipp

回答

3

不要將電話號碼存儲爲整數。將它們存儲爲字符串。當你有一個只包含數字的值和算術無意義的值時,如郵政編碼,銀行帳號或電話號碼,那麼將其存儲爲數字沒有多大意義。

  • 正如您已經注意到的那樣,當您想要搜索數字序列時,因爲計算機系統以二進制形式存儲整數,而不是十進制數,因此幾乎不可能搜索數字。
  • 你不能有前導零
  • 當數太長,你要麼遇到一個整數溢出或你將它轉化爲一個浮點數(在你的MongoDB驅動程序的自由裁量權)。兩者都會導致非常奇怪的行爲。

所有這些都適用於幾乎所有的數據庫,順便說一下,不僅僅是MongoDB。

但是,如果您完全確定將它們保留爲數字,您可以執行以下兩項操作。

  1. 當未知的位數是固定的,你可以使用$gt$lt運營商搜索範圍。 contactphone:{$gt:5556000, $lt:5556999}會找到所有數字5556xxx
  2. 您可以使用$where-查詢,它使用javascript函數在內部將每個數字轉換爲字符串,然後將正則表達式應用於該字符串。 $where: "String(this.contactphone).match(/^4832/) != null"。我希望你的數據庫中沒有很多文檔,因爲當你這樣做時,這個查詢可能需要一段時間。
+0

感謝您的回答。 – Jarema

+0

當然,你是對的。 我在psql中一直這樣做 - 由於與您提到的相同的原因,將大量「數字」存儲爲字符串。這不是任何生產環境。我只是在實際使用mongo之前進行實驗。 情況出現時,我做了一些CDR mongoimport,並mongoimport自動設置爲那些phonenumbers類型:numberlong。 我知道它不是那個問題,但是你知道在mongoimporting時爲特定字段選擇類型的方法嗎? – Jarema

+0

@Jarema請將此作爲一個新問題。 – Philipp