2017-04-05 326 views
1

是否可以查詢給定字符串中包含特定字段的文檔?MongoDB - 查找給定字符串中是否包含字段值

例如,如果我有這些文件:

{a: 'test blabla'}, 
{a: 'test not'} 

我想發現場a完全包含字符串"test blabla test"中的所有文件,所以只有第一個文件將返回

我知道我可以使用$indexOfCPaggregation做到這一點,也可能與$wheremapReduce。如果可以使用標準MongoDB運算符(例如$ gt,$ in)在find查詢中執行此操作,我就會遊蕩。

謝謝。

+0

'{a:'test'} ''也完全包含在''測試blabla測試'''中。你在尋找最接近的包含比賽嗎? – Veeram

+0

@Veeram對不起,我修正了這些文件。 (這也令我很困惑:D) – TomG

+1

對此功能的請求仍然是打開的https://jira.mongodb.org/browse/SERVER-13902 – JohnnyHK

回答

0

您可以使用正則表達式進行搜索。

db.company.findOne({"companyname" : {$regex : ".*hello.*"}}); 
+0

這是另一種方式,如果字符串包含在字段中。 – TomG

0

我能想到的2種方式,你可以這樣做:

選項1

使用$其中

db.someCol.find({ $where: function() { return "test blabla test".indexOf(this.a) > -1; } } 

解釋:查找其值的所有文檔在某些給定的字符串中找到字段「a」的字符串。

這種方法是通用的,因爲您可以運行您喜歡的任何代碼,但是從性能角度來看,建議較少。例如,它不能利用索引。閱讀完整$其中考慮在這裏:https://docs.mongodb.com/manual/reference/operator/query/where/#considerations

選項2

使用正則表達式匹配掛羊頭賣狗肉,在某些情況下ONLY;下面是僅與匹配字段值被發現爲給定的字符串的起始子工作的例子:

db.someCol.find({ a : /^(t(e(s(t((b(l(a(b(l(a((t(e(s(t)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$/ }) 

解釋:分手的成分你「應該待包含-內」字符串,並與正則表達式的所有子可能性進行匹配。

對於你的情況,這個選項是非常瘋狂的,但值得注意的是,可能有特定的情況下(如有限的命名空間匹配),你不必分解每個字母,但一些非常有限的預定部分。在這種情況下,這個選項仍然可以使用索引,並且不會遭受$ where性能的pentalties(只要正則表達式的複雜度不會超過該優點:):

+0

謝謝,但正如我在問題中所說的,我知道'$ where'和其他一些'aggregate'可能性是可能的。我想知道是否有可能使用標準的MongoDB操作符。 – TomG

+0

是選項2的變化調整爲某些情況。否則,JohnnyHK提到的功能請求將來可能會出現。 GL – Ciabaros

相關問題