2017-01-04 27 views
0

我有一個在RoboMongo中看起來像這樣的值的嵌套數組;搜索MongoDB中的所有集合數組

enter image description here

或者,這可能會稍微更清晰;

enter image description here

是否存在的能夠(在一個查詢)通過全部用正則表達式的鍵/值對搜索的方法嗎?該腳本不會知道有多少個customField鍵/值對!

到目前爲止我已經在PHP;

['poco.customFields.0.value' => ['$regex' => '.*'.$query.'.*', '$options' => 'i']],

這是工作的第一個鍵/值對很好。但沒有其他人,我不知道該怎麼做,沒有做任何兩個查詢或只是猜測會有沒有更多比如說100,然後循環。

+0

我相信這可以用$在哪裏完成,但不確定PHP語法,你可以檢查$在哪裏你可以傳遞一個JavaScript函數,它可以循環訪問數組中的鍵值對。 –

+0

您的預期產量是多少?你能否在你的問題中添加它? – dikesh

回答

0

假設您想要獲取具有特定正則表達式表達式的customFields內容的文檔,我可以想到兩種解釋。

(1)返回與至少一個值的所有文檔中的圖案匹配customFields:

[ 'customFields.value' => [ '$regex' => $pattern, '$options' => 'i' ]] 

(2)返回所有文件與所有值的圖案匹配customFields:

[ 'customFields.value' => [ '$not' => new MongoDB\BSON\Regex('\b^(?!'.$pattern.').+', 'i') ]] 

第一個查詢是不言自明的:遍歷customFields數組的所有元素並對每個元素執行正則表達式檢查。如果至少有一個元素與模式匹配,則返回父文檔。

第二個更復雜一點。要求「其中所有元件匹配特別模式」相當於「其中沒有單一元件不匹配特定圖案」。爲了實現雙重否定,我們使用$not以及通過對我們之前使用的相同查詢應用負向前視創建的反向正則表達式。由於$not拒絕接受字符串,因此我們使用MongoDB\BSON\Regex類的實例生成即時正則表達式。

有關負向預測的更多信息,請參見here

+0

真是太棒了。我已經做了一些測試,似乎可行。我不會認爲查詢會知道遍歷數組而不是僅僅出錯。 – mikelovelyuk

+0

@mikelovelyuk我很高興能夠提供幫助。請考慮將答案標記爲已接受,如果它確實解決了您的問題,或者添加其他詳細信息,您想澄清是否有任何問題。 – Imperator