Mongo: ค้นหาไอเท็มที่ไม่มีฟิลด์ที่แน่นอน


107

จะค้นหาเอกสารในคอลเลคชันที่ไม่มีฟิลด์บางฟิลด์ใน MongoDB ได้อย่างไร

คำตอบ:


171

ใช่เป็นไปได้โดยใช้$ มีอยู่ :

db.things.find( { a : { $exists : false } } ); // return if a is missing

เมื่อเป็นจริง $ จะตรงกับเอกสารที่มีฟิลด์รวมถึงเอกสารที่ค่าฟิลด์เป็นโมฆะ ถ้าเป็นเท็จแบบสอบถามจะส่งคืนเฉพาะเอกสารที่ไม่มีเขตข้อมูล


1
ได้รับการเตือน$existแบบสอบถามไม่สามารถใช้ดัชนีได้ (ดูmongodb.org/display/DOCS/… )
ธีโอ

4
@Theo: เริ่มต้นจาก MongoDB 2.0 $ ที่มีอยู่สามารถใช้ดัชนี ( jira.mongodb.org/browse/SERVER-393 )
Dmitry Schetnikovich

ฉันหลังจากนี้เพื่อให้ Mongoid ใช้ในขอบเขต หน้าตาเป็นแบบนี้>scope :without_recommendation, :where => {:recommendation => {"$exists"=>false}}
genkilabs

50

หากคุณไม่สนใจว่าฟิลด์จะหายไปหรือnull(หรือไม่เคยnull) คุณสามารถใช้ฟิลด์ที่สั้นและปลอดภัยกว่าเล็กน้อย:

db.things.find( { a : null } ); // return if a is missing or null

ปลอดภัยกว่าเพราะ$existsจะส่งคืนtrueแม้ว่าฟิลด์จะเป็นโมฆะซึ่งมักจะไม่ใช่ผลลัพธ์ที่ต้องการและอาจนำไปสู่ ​​NPE ได้


1
อย่างไรก็ตามบางคนที่อ่านโค้ดอาจตีความได้ว่าฟิลด์จะต้องมีค่าเท่ากับnullและไม่ขาดหายไป นี่เป็นพฤติกรรมที่ไม่คาดคิดจริง ๆ เพราะคุณไม่สามารถทำเช่นเดียวกันกับ0(ซึ่งก็เช่นกันfalse) ดังนั้นจึงnullเป็นข้อยกเว้นที่นี่ ดังนั้นแนวทางปฏิบัติที่ดีที่สุดคือคำตอบที่อ่านง่ายขึ้นโดยใช้$exists: falseซึ่งไม่คลุมเครือ โปรดจำไว้ว่าตัวแปรที่สั้นกว่าเล็กน้อยของคุณจะไม่สั้นลงหากคุณจำเป็นต้องมีความคิดเห็นนั้นอยู่เบื้องหลัง!
เยติ

@Yeti ถ้าเป้าหมายของฉันคือการหาวัตถุทั้งหมดที่ขาดหายไปค่าสำหรับฟิลด์aเช่นกันเพราะaเป็นnullหรือเพราะaเป็นหายไปแล้ว$existsไม่ดีพอในขณะที่มันจะไม่จับกรณีที่เป็นa null
nilskp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.