จะค้นหาเอกสารในคอลเลคชันที่ไม่มีฟิลด์บางฟิลด์ใน MongoDB ได้อย่างไร
จะค้นหาเอกสารในคอลเลคชันที่ไม่มีฟิลด์บางฟิลด์ใน MongoDB ได้อย่างไร
คำตอบ:
ใช่เป็นไปได้โดยใช้$ มีอยู่ :
db.things.find( { a : { $exists : false } } ); // return if a is missing
เมื่อเป็นจริง $ จะตรงกับเอกสารที่มีฟิลด์รวมถึงเอกสารที่ค่าฟิลด์เป็นโมฆะ ถ้าเป็นเท็จแบบสอบถามจะส่งคืนเฉพาะเอกสารที่ไม่มีเขตข้อมูล
scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
หากคุณไม่สนใจว่าฟิลด์จะหายไปหรือnull
(หรือไม่เคยnull
) คุณสามารถใช้ฟิลด์ที่สั้นและปลอดภัยกว่าเล็กน้อย:
db.things.find( { a : null } ); // return if a is missing or null
ปลอดภัยกว่าเพราะ$exists
จะส่งคืนtrue
แม้ว่าฟิลด์จะเป็นโมฆะซึ่งมักจะไม่ใช่ผลลัพธ์ที่ต้องการและอาจนำไปสู่ NPE ได้
null
และไม่ขาดหายไป นี่เป็นพฤติกรรมที่ไม่คาดคิดจริง ๆ เพราะคุณไม่สามารถทำเช่นเดียวกันกับ0
(ซึ่งก็เช่นกันfalse
) ดังนั้นจึงnull
เป็นข้อยกเว้นที่นี่ ดังนั้นแนวทางปฏิบัติที่ดีที่สุดคือคำตอบที่อ่านง่ายขึ้นโดยใช้$exists: false
ซึ่งไม่คลุมเครือ โปรดจำไว้ว่าตัวแปรที่สั้นกว่าเล็กน้อยของคุณจะไม่สั้นลงหากคุณจำเป็นต้องมีความคิดเห็นนั้นอยู่เบื้องหลัง!
a
เช่นกันเพราะa
เป็นnull
หรือเพราะa
เป็นหายไปแล้ว$exists
ไม่ดีพอในขณะที่มันจะไม่จับกรณีที่เป็นa
null
$exist
แบบสอบถามไม่สามารถใช้ดัชนีได้ (ดูmongodb.org/display/DOCS/… )