2010-05-25 77 views
13

我想正則表達式搜索MongoDB中的整數值。這可能嗎?MongoDB正則表達式搜索整數值

我正在構建一個CRUD類型的接口,允許*在各個領域的通配符。我試圖保持一致的幾個字段是整數的UI。

考慮:

> db.seDemo.insert({ "example" : 1234 }); 
> db.seDemo.find({ "example" : 1234 }); 
{ "_id" : ObjectId("4bfc2bfea2004adae015220a"), "example" : 1234 } 
> db.seDemo.find({ "example" : /^123.*/ }); 
> 

正如你所看到的,我插入的對象,我能夠通過值找到它。如果我嘗試一個簡單的正則表達式,我實際上找不到該對象。

謝謝!

回答

35

如果您想對數字進行模式匹配,在mongo中執行此操作的方式是使用$ where表達式並傳入模式匹配。

> db.test.find({ $where: "/^123.*/.test(this.example)" }) 
{ "_id" : ObjectId("4bfc3187fec861325f34b132"), "example" : 1234 } 
+4

作爲一個無關尖端,以使在PHP這項工作,需要在陣列通過( '$其中'=>新MongoCode(/^123 * /。 .test(this.example)「); – 2010-05-28 00:37:33

+2

@dalton只是好奇在這裏,$ regex操作符不會比$更有效嗎? – talentedmrjones 2011-10-17 20:32:18

+0

認爲類似的東西應該適用於Ruby驅動程序,正如@gary指出的那樣,但不是。這應該像一個魅力db.test.find(「$ where」=>「/^123.*/.test(this.example)」) – Vivek 2012-08-22 18:41:40

3

我不使用的,因爲它計算的查詢表達式,如果查詢使用用戶輸入數據的安全風險的方式$where查詢經營者的忠實粉絲。

這就是說,最好的方法是對你的文檔$project添加另一個計算字段,它是你的數字的字符串值。

$toLower和他的兄弟$toUpper分別將字符串轉換爲小寫字母和大寫字母,但有一個未知的特徵,它可以用來將整數轉換爲字符串。

$match運算符使用$regex運算符返回所有與您的模式相匹配的文檔。

db.seDemo.aggregate(
    [ 
     { "$project": { 
      "stringifyExample": { "$toLower": "$example" }, 
      "example": 1 
     }}, 
     { "$match": { "stringifyExample": /^123.*/ } } 
    ] 
) 

這將產生:

{ 
    "_id" : ObjectId("579c668c1c52188b56a235b7"), 
    "example" : 1234, 
    "stringifyExample" : "1234" 
} 

{ 
    "_id" : ObjectId("579c66971c52188b56a235b9"), 
    "example" : 12334, 
    "stringifyExample" : "12334" 
} 

現在,如果你想要的是檢索所有包含特定字符串時,更容易和更好的方式做文檔,這是在即將發佈MongoDB(撰寫本文時)使用允許邏輯處理的$redact運算符。 $indexOfCP

db.seDemo.aggregate([ 
    { "$redact": { 
     "$cond": [ 
      { "$gt": [ 
       { "$indexOfCP": [ 
        { "$toLower": "$example" }, 
        "123" 
       ] }, 
       -1 
      ] }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    }} 
]) 

其產生:

{ 
    "_id" : ObjectId("579c668c1c52188b56a235b7"), 
    "example" : 1234 
} 

{ 
    "_id" : ObjectId("579c66971c52188b56a235b9"), 
    "example" : 12334 
}