MongoDB ไม่เท่ากับ


102

ฉันกำลังพยายามแสดงข้อความค้นหาใน MongoDB โดยที่ช่องข้อความไม่ใช่ '' (ว่าง)

{ 'name' : { $not : '' }}

อย่างไรก็ตามฉันได้รับข้อผิดพลาด invalid use of $not

ฉันได้ตรวจสอบเอกสารแล้ว แต่ตัวอย่างที่ใช้สำหรับกรณีที่ซับซ้อน (ด้วย regexp และการ$notปฏิเสธโอเปอเรเตอร์อื่น)

ฉันจะทำสิ่งง่ายๆที่พยายามทำได้อย่างไร

คำตอบ:


147

ใช้$ne- $notควรตามด้วยตัวดำเนินการมาตรฐาน:

ตัวอย่างสำหรับ$neซึ่งหมายถึงไม่เท่ากัน:

use test
switched to db test
db.test.insert({author : 'me', post: ""})
db.test.insert({author : 'you', post: "how to query"})
db.test.find({'post': {$ne : ""}})
{ "_id" : ObjectId("4f68b1a7768972d396fe2268"), "author" : "you", "post" : "how to query" }

และตอนนี้$notซึ่งใช้เวลาในเพรดิเคต ( $ne) และลบล้าง ( $not):

db.test.find({'post': {$not: {$ne : ""}}})
{ "_id" : ObjectId("4f68b19c768972d396fe2267"), "author" : "me", "post" : "" }

4
สำหรับผู้ที่อยากรู้อยากเห็น$neหมายถึง "ไม่เท่ากัน"
abraham

1
คำตอบนี้มีผู้โหวตจำนวนมาก แต่คำอธิบายไม่ชัดเจนมาก เกิดอะไรขึ้นในตัวอย่างที่มีทั้ง $ not และ $ ne?
GaTechThomas

ดังนั้นในระยะสั้น$not :{ $neหมายถึง $eqนี้คือสิ่งที่คุณกำลังพยายามที่จะพูด?
อนุ



10

จากเอกสาร Mongo :

ตัว$notดำเนินการมีผลกับตัวดำเนินการอื่น ๆ เท่านั้นและไม่สามารถตรวจสอบช่องและเอกสารได้โดยอิสระ ดังนั้นใช้ตัว$notดำเนินการสำหรับการแยกทางตรรกะและตัว$neดำเนินการเพื่อทดสอบเนื้อหาของฟิลด์โดยตรง

เนื่องจากคุณกำลังทดสอบสนามโดยตรง$neจึงเป็นตัวดำเนินการที่เหมาะสมที่จะใช้ที่นี่

แก้ไข:

สถานการณ์ที่คุณต้องการใช้$notคือ:

db.inventory.find( { price: { $not: { $gt: 1.99 } } } )

นั่นจะเป็นการเลือกเอกสารทั้งหมดที่:

  • ค่าฟิลด์ราคาน้อยกว่าหรือเท่ากับ 1.99 หรือราคา
  • ไม่มีฟิลด์


2

ตัวอย่างชีวิตจริง ค้นหาทั้งหมด แต่ไม่ใช่ผู้ใช้ปัจจุบัน:

var players = Players.find({ my_x: player.my_x,  my_y: player.my_y, userId: {$ne: Meteor.userId()} }); 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.