Bagaimana saya bisa menggunakan operator 'Tidak Suka' di MongoDB

98

Saya dapat menggunakan LikeOperator SQL menggunakan pymongo,

db.test.find({'c':{'$regex':'ttt'}})

Tapi bagaimana saya bisa menggunakan Not LikeOperator?

Saya mencoba

db.test.find({'c':{'$not':{'$regex':'ttt'}})

tetapi mendapat kesalahan:

OperationFailure: $ not tidak boleh memiliki regex

KyungHoon Kim
sumber
1
Saya tahu ini agak terlambat tetapi di MongoDB 4.2, operator $notdan $regexdalam kombinasi tampaknya berfungsi untuk saya.
b00r00x0

Jawaban:

139

Dari dokumen :

Operator $ not tidak mendukung operasi dengan operator $ regex. Sebagai gantinya gunakan // atau di antarmuka driver Anda, gunakan kemampuan ekspresi reguler bahasa Anda untuk membuat objek ekspresi reguler. Pertimbangkan contoh berikut yang menggunakan ekspresi pencocokan pola //:

db.inventory.find( { item: { $not: /^p.*/ } } )

EDIT (@idbentley):

{$regex: 'ttt'}umumnya setara dengan /ttt/di mongodb, jadi kueri Anda akan menjadi:

db.test.find({c: {$not: /ttt/}}

EDIT2 (@kim Kim):

Di python , di bawah ini berfungsi:

'c':{'$not':re.compile('ttt')}
shx2
sumber
2
Agar jelas, {$regex: 'ttt'}umumnya sama dengan /ttt/di mongodb, jadi kueri Anda akan menjadi db.test.find({c: {$not: /ttt/}}.
idbentley
@idbent terima kasih. Saya memperbarui jawaban saya dengan klarifikasi Anda.
shx2
1
Terima kasih banyak. Untuk orang lain, saya dulu 'c':{'$not':re.compile('ttt')}. Tentu saja, Anda perlu mengimpor ulang
KyungHoon Kim
Bagus. Saya juga menambahkan komentar Anda pada jawabannya, untuk anak cucu.
shx2
1
Ini tampaknya kasus yang sama dengan $ ne dan $ regex. Adakah yang bisa mengkonfirmasi ini, atau setidaknya menambahkannya?
DBrown
56

Anda dapat melakukannya dengan regex yang tidak mengandung kata. Anda juga bisa menggunakan$options => i untuk kasus pencarian tidak sensitif.

Tidak Berisi string

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

Tidak peka huruf besar / kecil string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

Dimulai dengan string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

Berakhir dengan string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

Mengandung string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

Simpan ini sebagai penanda, dan referensi untuk perubahan lain yang mungkin Anda perlukan. http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

Somnath Muluk
sumber