MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Temukan dokumen mongodb menggunakan string _id parsial

$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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Koneksi AngularJS dengan MongoDB

  2. Apa cara tercepat untuk menyalin koleksi dalam database yang sama?

  3. MongoDB $bukan Operator Pipa Agregasi

  4. Spring :Bisakah kelas menjadi @Document dan @Table

  5. tidak dapat menemukan kacang untuk MongoRepository (Boot Musim Semi)