เงื่อนไขการจับคู่หลายรายการสำหรับองค์ประกอบอาร์เรย์เดียวกัน

ฉันมีคอลเลกชันชื่ออุปกรณ์ซึ่งมีเอกสารประมาณ 50,000 ฉบับ ฉันกำลังพยายามสืบค้นอาร์เรย์เส้นทางภายในแต่ละเอกสารและให้มันส่งคืนเอกสารหากตรงตามเงื่อนไขหลายประการสำหรับองค์ประกอบอาร์เรย์แต่ละรายการ ปัญหาคือดูเหมือนว่า Mongo กำลังให้คำตอบตรงตามเงื่อนไขหลายประการสำหรับองค์ประกอบอาเรย์ที่แตกต่างกัน

ข้อมูลตัวอย่าง:

{
    "_id": 0,
    "name": "example1",
    "serial": "123456",
    "routes": [
        {
            "description": "8989",
            "zone": "front"
        },
        {
            "description": "1221",
            "zone": "back"
        }
    ]
},
{
    "_id": 1,
    "name": "example2",
    "serial": "987654",
    "routes": [
        {
            "description": "1515",
            "zone": "front"
        },
        {
            "description": "8989",
            "zone": "side"
        }
    ]
}

ฉันได้ลองใช้รูปแบบ .find() แบบง่าย ๆ โดยไม่มีโชคด้วย

db.devices.find({"routes.description":"8989", "routes.zone":"front"})
db.devices.find({"$and": [{"routes.description":"8989"}, {"routes.zone":"front"}]})

ฉันได้ลองการรวมกลุ่มซึ่งดูเหมือนจะล้มเหลวกับฉันเนื่องจากความเข้าใจของฉันเกี่ยวกับสิ่งเหล่านั้นยังอยู่ในระดับประถมศึกษา ผลลัพธ์ที่ต้องการสำหรับข้อความค้นหาข้างต้นจะเป็นเอกสารเดียว (_id:0) และไม่ใช่ทั้งสองเอกสาร

{ "_id" : 0, "name" : "example1", "serial" : "123456", "routes" : [ { "description" : "8989", "zone" : "front" }, { "description" : "1221", "zone" : "back" } ] }

นอกจากนี้ จำเป็นต้องมีความสามารถในการสืบค้นอาร์เรย์โดยใช้ตัวดำเนินการ $in ตัวอย่างเช่น ผลลัพธ์ที่ต้องการของการสืบค้นต่อไปนี้จะเป็นเอกสารทั้งสองฉบับ เนื่องจากทั้งสองเอกสารมีเส้นทางที่ตรงกับโซน:ด้านหน้า และคำอธิบายที่อยู่ในรายการ

db.devices.find({"$and": [{"routes.description": { $in: ["8989", "1515"] }}, {"routes.zone":"front"}]})

person r6danl99    schedule 31.08.2020    source แหล่งที่มา


คำตอบ (1)


คุณเพียงแค่ต้องใช้ $elemMatch ที่นี่

db.devices.find({routes: {$elemMatch: {description:"8989", zone:"front"}}})

ตัวอย่าง

person namar sood    schedule 31.08.2020
comment
คุณตอบได้ไหม? stackoverflow.com/questions/67600862 / - person Tejas Ratunawar; 19.05.2021