ฉันจะใช้โอเปอเรเตอร์ 'ไม่ชอบ' ใน MongoDB ได้อย่างไร


103

ฉันสามารถใช้ SQL Likeประกอบการใช้pymongo,

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

แต่ฉันจะใช้Not LikeOperator ได้อย่างไร?

ฉันเหนื่อย

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

แต่มีข้อผิดพลาด:

OperationFailure: $ not ไม่สามารถมี regex ได้


1
ฉันรู้ว่านี่ช้าไปหน่อย แต่ใน MongoDB 4.2 $notและ$regexโอเปอเรเตอร์ในการรวมกันดูเหมือนจะใช้ได้กับฉัน
b00r00x0

คำตอบ:


145

จากเอกสาร :

ตัวดำเนินการ $ not ไม่สนับสนุนการดำเนินการกับตัวดำเนินการ $ regex แทนที่จะใช้ // หรือในอินเทอร์เฟซไดรเวอร์ของคุณให้ใช้ความสามารถในการแสดงออกปกติของภาษาของคุณเพื่อสร้างอ็อบเจ็กต์นิพจน์ทั่วไป พิจารณาตัวอย่างต่อไปนี้ซึ่งใช้นิพจน์การจับคู่รูปแบบ //:

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

แก้ไข (@idbentley):

{$regex: 'ttt'}โดยทั่วไปจะเทียบเท่ากับ/ttt/ใน mongodb ดังนั้นคำถามของคุณจะกลายเป็น:

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

EDIT2 (@KyungHoon Kim):

ในpythonด้านล่างหนึ่งงาน:

'c':{'$not':re.compile('ttt')}

2
ต้องมีความชัดเจน {$regex: 'ttt'}โดยทั่วไปเทียบเท่ากับ/ttt/ใน MongoDB db.test.find({c: {$not: /ttt/}}เพื่อให้การค้นหาของคุณก็จะกลายเป็น
idbentley

@idbentley ขอบคุณครับ. ฉันอัปเดตคำตอบพร้อมคำชี้แจงของคุณ
shx2

1
ขอบคุณมาก. สำหรับคนอื่น ๆ ฉันใช้'c':{'$not':re.compile('ttt')}. แน่นอนคุณต้องนำเข้า re
KyungHoon Kim

เยี่ยมมาก ฉันยังเพิ่มความคิดเห็นของคุณในคำตอบสำหรับลูกหลาน
shx2

1
ดูเหมือนว่าจะเป็นกรณีเดียวกันกับ $ ne และ $ regex ใครสามารถยืนยันสิ่งนี้หรืออย่างน้อยก็เพิ่มเข้าไป
DBrown

57

คุณสามารถทำได้ด้วย regex ที่ไม่มีคำ นอกจากนี้คุณสามารถใช้$options => iสำหรับกรณีของการค้นหาที่ไม่ละเอียดอ่อน

ไม่มี string

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

ไม่คำนึงถึงกรณีที่แน่นอน string

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

เริ่มต้นด้วย string

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

ลงท้ายด้วย string

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

ประกอบด้วย string

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

เก็บสิ่งนี้ไว้เป็นที่คั่นหน้าและเป็นข้อมูลอ้างอิงสำหรับการเปลี่ยนแปลงอื่น ๆ ที่คุณอาจต้องการ http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.