Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

MongoDB Query: ใช้ $nor เพื่อยกเว้นเอกสารเฉพาะ

Operator $nor` ใน MongoDB ใช้สำหรับ query แบบ "ไม่ใช่ทั้งหมด" (Logical NOR) - คืนค่าเอกสารที่ ไม่ตรง ทุกเงื่อนไขใน array ที่กำหนด

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.demo100.insertOne({"Name":"Chris","Age":21});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d9624b8903cdd865577c0") }
> db.demo100.insertOne({"Name":"David","Age":23});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d962cb8903cdd865577c1") }
> db.demo100.insertOne({"Name":"Bob","Age":19});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2d9634b8903cdd865577c2") }

แสดงข้อมูลทั้งหมด

> db.demo100.find();

ผลลัพธ์: 3 เอกสาร (Chris/21, David/23, Bob/19)

Query ใช้ $nor ยกเว้นเอกสารที่ Name=Chris หรือ Age=21

> db.demo100.find({
  $nor: [
    { Name: "Chris" },
    { Name: { $exists: false } },
    { Age: 21 },
    { Age: { $exists: false } }
  ]
});

คำอธิบายเงื่อนไขใน $nor:

  • {Name: "Chris"}: ยกเว้น Name = Chris
  • {Name: {$exists: false}}: ยกเว้นเอกสารที่ไม่มี field Name
  • {Age: 21}: ยกเว้น Age = 21
  • {Age: {$exists: false}}: ยกเว้นเอกสารที่ไม่มี field Age

$nor = NOT (condition1 OR condition2 OR ...) = เอกสารต้อง ไม่ตรง ทุกเงื่อนไขจึงจะถูกเลือก

ผลลัพธ์

{ "_id" : ObjectId("5e2d962cb8903cdd865577c1"), "Name" : "David", "Age" : 23 }
{ "_id" : ObjectId("5e2d9634b8903cdd865577c2"), "Name" : "Bob", "Age" : 19 }

David (Age 23) และ Bob (Age 19) ผ่าน เพราะ: - Name ไม่ใช่ Chris ✓ - มี field Name ✓ - Age ไม่ใช่ 21 ✓ - มี field Age ✓

เปรียบเทียบ $nor vs $not vs $nin

ตัวอย่าง $nor ทั่วไป

// หา user ที่ไม่ใช่ admin และไม่ใช่ banned
db.users.find({
  $nor: [
    { role: "admin" },
    { status: "banned" },
    { role: { $exists: false } }
  ]
})

ข้อควรระวัง: $nor อาจช้าเพราะต้องตรวจสอบทุกเงื่อนไข ควรมี index รองรับ field ที่ query บ่อย

Operatorความหมายใช้เมื่อไหร่
$norไม่ใช่เงื่อนไขใดเลย (NOR)หลายเงื่อนไข ต้อง fail ทั้งหมด
$notย้อนกลับเงื่อนไขเดียวexpression เดียว
$ninไม่อยู่ใน arrayfield value ไม่อยู่ในค่าที่กำหนด