在實(shí)際開發(fā)中, 有不少的場(chǎng)景需要使用到模糊查詢, MongoDB shell 模糊查詢很簡(jiǎn)單:
db.collection.find({'_id': /^5101/})
上面這句就是查詢_id以'5101'開始的內(nèi)容给赞。
在老的MogoDB中模糊查詢挺簡(jiǎn)單的, 隨便百度搜下就能找到, 我就不再說(shuō)了, 這里主要就講下新PHP驅(qū)動(dòng)中怎么查詢:
$query = new \MongoDB\Driver\Query(['_id' => ['$regex' => '^5101']]);
$this->getManager()->executeQuery($this->dbname . $this->collection, $query);
上面就是新驅(qū)動(dòng)中執(zhí)行模糊查詢, 說(shuō)實(shí)話, 挺吐槽這個(gè)新驅(qū)動(dòng), 相比老的驅(qū)動(dòng), 這個(gè)函數(shù)名也太長(zhǎng)了吧光酣。歪泳。。都快超過(guò)swift的函數(shù)名了。而且老驅(qū)動(dòng)上的不少功能都在新驅(qū)動(dòng)上干掉了。雖然提供了一個(gè)mongodb php library的類庫(kù)來(lái)操作, 但是這個(gè)庫(kù)里面有60多個(gè)文件,有時(shí)候比我項(xiàng)目文件還要多君旦,這是鬧哪樣。這我建議自己去封裝一個(gè)Driver類來(lái)使用嘲碱。
上面吐槽吐的有點(diǎn)跑題了, 除了直接模糊查詢, 在和$in
或$nin
使用的時(shí)候, 需要特別注意下:
$filter = ['_id' => ['$in' => ['$regex' => '^5101']]];
如果你像上面那么寫filter的話, 執(zhí)行的時(shí)候?qū)伋鲆粋€(gè)致命錯(cuò)誤:
PHP Fatal error: Uncaught MongoDB\Driver\Exception\ConnectionException: $in needs an array in filename
這里說(shuō)$in
里面需要提供一個(gè)數(shù)組, 那么我們把上面的$filter改下, 給它弄個(gè)數(shù)組過(guò)去:
$filter = ['_id' => ['$in' => [['$regex' => '^5101']]];
但是不幸的是, 還是無(wú)法成功的得到想要的結(jié)果:
PHP Fatal error: Uncaught MongoDB\Driver\Exception\ConnectionException: cannot nest $ under $in in filename
這里說(shuō)$in
中不能出現(xiàn)$
, 那咋辦呢金砍? 其實(shí)在$in或$nin中要使用模糊匹配, 需要使用\MongoDB\BSON\Regex
類的實(shí)例:
$filter = ['_id' => ['$in' => [new \MongoDB\BSON\Regex('^5101','i')]]];
這次終于得到我們想要的結(jié)果了。
關(guān)于MongoDB的操作我會(huì)陸續(xù)更新, 感謝各位看官賞臉, 如果文中出現(xiàn)錯(cuò)誤, 你可以通過(guò)郵箱聯(lián)系我: pchangl@163.com