การจับคู่ในฟิลด์ _id แบบผสมในการรวม MongoDB

ฉันเป็นสามเณร MongoDB ดังนั้นโปรดยกโทษให้ฉันหากคำถามนี้มีคำตอบที่ชัดเจน ...

บริบท:

ฉันได้ปฏิบัติตามตัวอย่างในเอกสาร MongoDB เพื่อใช้การรวมแบบลำดับชั้น ใช้แผนที่-ลด ตัวอย่างใช้ฟิลด์ "compound" _id เป็นคีย์ลดแผนที่ซึ่งสร้างเอกสารรวมเช่นนี้...

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

ทั้งหมดนี้เป็นสิ่งที่ดีและดี กรณีการใช้งานเฉพาะของฉันกำหนดให้ส่งค่าสำหรับคีย์ที่คล้ายกัน หลาย ในแต่ละ map ขั้นตอน ตัวอย่างเช่น...

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), hobby: "wizardry" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), gender: "male" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

(ค่าจะเท่ากัน แต่คีย์ _id แตกต่างกันเล็กน้อย)

นี่ก็ดีและดีเช่นกัน

คำถาม:

ตอนนี้ ฉันต้องการรวมคอลเลกชันตามลำดับชั้น (มุมมอง) ของฉัน ซึ่งมีเอกสารที่มีฟิลด์ผสม _id ที่แตกต่างกันหลายรายการ แต่จะรวมเฉพาะกับเอกสารที่มีฟิลด์ $matching _id เท่านั้น ตัวอย่างเช่น ฉันต้องการรวมเฉพาะเอกสารที่มีประเภท {u: String, d: Date, hobby: String} _id หรือเฉพาะเอกสารที่มีประเภท _id {u: String, d: Date}

ฉันทราบว่าฉันสามารถใช้ตัวดำเนินการ $exists เพื่อจำกัดฟิลด์ _id ใดที่ควรและไม่ควรได้รับอนุญาต แต่ฉันไม่ต้องการสร้างการรวมแยกกันสำหรับแต่ละ _id (อาจมีหลายรายการ)

มีวิธีง่ายๆ ในการจำกัดเอกสาร $matching โดยทางโปรแกรมไว้เฉพาะเอกสารที่มี (หรือไม่มี) ฟิลด์เฉพาะในการรวมหรือไม่


person jonas    schedule 23.07.2013    source แหล่งที่มา


คำตอบ (1)


ฉันคิดว่าวิธีที่ดีที่สุดในการแก้ไขปัญหานี้คือการจัดเก็บข้อมูลของคุณด้วยวิธีอื่น การเรียงลำดับ "_id" ของคุณมีค่าที่กำหนดเองเป็นคีย์และนั่นคือสิ่งที่คุณควรหลีกเลี่ยง ฉันอาจจะเก็บเอกสารเป็น:

{
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: hobby, value: "wizardry" }
}
{
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: gender, value: "male" },
}

แล้วการจับคู่ของคุณก็เพราะว่าง่ายโดยไม่ต้องสร้างการจับคู่ที่แตกต่างกันสำหรับแต่ละประเภท

person Derick    schedule 24.07.2013
comment
ยุติธรรมเพียงพอ แต่จะเกิดอะไรขึ้นหากฉันมีที่จะจับคู่ตามฟิลด์ _id เพียงอย่างเดียว - person jonas; 24.07.2013
comment
ในกรณีของฉัน ฟิลด์ _id นั้นไม่ง่ายอย่างที่ฉันได้ระบุไว้ที่นี่ (เช่น แตกต่างกันด้วยฟิลด์เดียว) คำถามของฉันคือวิธีการ $match (อาจใช้ตัวดำเนินการ $exists) ตามฟิลด์ที่มีอยู่ (และไม่มีอยู่) ในฟิลด์ _id โดยไม่ต้องระบุชุดค่าผสมของฟิลด์ที่เป็นไปได้ทั้งหมด ดังนั้น หากมีเทมเพลต _id ฉันต้องการรวม เพียง เหนือเอกสารที่มีฟิลด์ _id ที่ตรงกับเทมเพลต - person jonas; 24.07.2013
comment
ทำไมคุณถึงติดสิ่งเหล่านี้ทั้งหมดไว้ใน _id ล่ะ? - person Derick; 24.07.2013
comment
เป็นผลมาจากกระบวนการลดแผนที่ - person jonas; 24.07.2013
comment
ฉันคิดว่าคุณควรวาดภาพให้ภาพรวมของสิ่งที่คุณพยายามทำเนื่องจากฉันเห็นเพียงส่วนเล็กๆ เท่านั้น ซึ่งไม่ใช่ฐานที่ดีในการให้การสนับสนุน! - person Derick; 24.07.2013
comment
คุณสามารถให้อินพุตและเอาต์พุตที่ต้องการ (สอดคล้องกับอินพุตที่กำหนด) จึงสามารถนำเข้าเอกสารเหล่านั้นและทดสอบได้ - person Fake Fish; 04.05.2016