$regex
dan MongoRegex (yaitu tipe regex BSON yang digunakan dalam pencocokan kesetaraan) hanya mendukung pencocokan terhadap string, jadi Anda tidak dapat menggunakannya secara langsung dengan ObjectId.
Mengenai contoh kode terakhir Anda, Anda mencoba menggunakan $where
dalam konstruktor MongoRegex:
$searchTermsAny[] = array(
$dataProps[$i] => new MongoRegex( '/'.$sRegex.'/i',
'$where: "this._id.toString().match(/'.$sRegex.'/i)"' )
);
MongoRegex
konstruktor mengambil satu string (mis. /foo/i
), dari mana ia memperoleh pola dan bendera. $where
dimaksudkan untuk digunakan sebagai operator kueri tingkat atas (tidak terkait dengan nama bidang apa pun). Saya tidak mengikuti apa yang Anda lakukan dengan $dataProps[$i]
, tetapi misalkan Anda sedang membuat satu $where
kueri untuk mencocokkan representasi string ObjectId. Dokumen kueri akan terlihat seperti berikut:
{ $where: 'this._id.str.match(/00005/)' }
Perhatikan bahwa saya mengakses str
properti di sini alih-alih menjalankan toString()
. Itu karena toString()
sebenarnya mengembalikan representasi Shell dari ObjectId. Anda dapat melihat ini dengan memeriksa sumbernya di shell:
> x = new ObjectId()
ObjectId("5409ddcfd95d6f6a2eb33e7f")
> x.toString
function (){
return "ObjectId(" + tojson(this.str) + ")";
}
Juga, jika Anda hanya memeriksa apakah ada substring di _id
representasi hex, Anda mungkin ingin menggunakan indexOf()
(dengan != -1
perbandingan) alih-alih match()
dengan ekspresi reguler.
Yang mengatakan, menggunakan $where
umumnya merupakan ide yang buruk jika Anda tidak menggabungkannya dengan kriteria kueri tambahan yang dapat menggunakan indeks. Ini karena $where
memanggil juru bahasa JavaScript untuk setiap dokumen yang dipertimbangkan dalam kumpulan hasil. Jika Anda menggabungkannya dengan kriteria lain yang lebih selektif, MongoDB dapat menggunakan indeks dan mempersempit dokumen yang perlu dievaluasi dengan $where
; namun, Anda berada dalam waktu yang buruk jika Anda menggunakan $where
dan memindai banyak dokumen atau pemindaian tabel dalam kasus terburuk.
Anda mungkin lebih baik membuat bidang kedua di setiap dokumen yang berisi representasi string hex dari _id
. Kemudian, Anda dapat mengindeks bidang itu dan memintanya menggunakan regex. Kueri regex yang tidak berlabuh masih akan sedikit tidak efisien (lihat:gunakan indeks regex
di dokumen), tetapi ini masih harus jauh lebih cepat daripada menggunakan $where
.
Solusi ini (menduplikasi _id
string) akan dikenakan beberapa penyimpanan tambahan per dokumen, tetapi Anda dapat memutuskan 24-30 byte tambahan (payload string dan nama bidang pendek) diabaikan.