ลบเอกสารลูก orhpan ในฐานข้อมูล mongo

ฉันเข้าใจว่าเมื่อคุณทำลายเอกสารหลักใน Mongo คุณจะทำลายลูก ๆ ของเอกสารนั้นด้วย และมันจะลดระดับลงจนกว่าเอกสารอ้างอิงทั้งหมดจะถูกลบออก

ฉันมีโครงสร้างการรวบรวมดังต่อไปนี้

class A
    include Mongoid::Document
    field :name, :type => String
    has_many :bs
end

class B
    include Mongoid::Document
    field :name, :type => String
    has_many :cs
end

class C
    include Mongoid::Document
    field :name, :type => String
end

ฉันเจอสถานการณ์ในโค้ดของฉันซึ่งฉันต้องลบ Class A หนึ่งรายการและเอกสารที่เกี่ยวข้องทั้งหมด เนื่องจากแต่ละโมเดลเหล่านี้ใช้ Mongoid ฉันจึงใช้วิธี destroy_all เช่นนั้น

a = A.where({'_id' => "123456789"})
a.bs.destroy_all
 => 'however many a's I had'

จากการอ่านเอกสาร ฉันคิดว่าเอกสารอ้างอิงแต่ละฉบับจะถูกลบออกเช่นกัน

น่าเสียดายที่สิ่งที่เกิดขึ้นคือคลาส b ของฉันหายไปหมดแล้ว และฉันมีคลาส c กำพร้าจำนวนหนึ่งในฐานข้อมูลของฉัน

So:

A) สมมติว่า destroy_all ไม่ได้ทำอย่างที่ฉันคิด มีอะไรที่สามารถใช้เพื่อลบพาเรนต์และเอกสารอ้างอิงทั้งหมดใน mongoid หรือไม่?

B) แม้ว่าฉันจะดำเนินการนี้บนเครื่องท้องถิ่น แต่ฉันก็ยังอยากทราบว่า มีวิธีใดบ้างที่จะลบเอกสารที่ไม่เกี่ยวข้องออกจากคอลเลกชันที่เปลี่ยนแปลง


person OVERTONE    schedule 16.10.2012    source แหล่งที่มา


คำตอบ (2)


ฉันเข้าใจว่าเมื่อคุณทำลายเอกสารหลักใน Mongo คุณจะทำลายเอกสารย่อยของเอกสารนั้นด้วย

เมื่อเป็นเอกสารฉบับเดียวเท่านั้น คุณกำลังแสดงโครงสร้างของเอกสารจำนวนมาก

ฉันไม่ใช่โปรแกรมเมอร์ Ruby และฉันไม่เคยใช้ mongoid แต่ดูเหมือนว่า destroy_all โดยพื้นฐานแล้วจะเป็น remove ที่ตรงกับเอกสารมากกว่าหนึ่งเอกสารตามที่เอกสารรองรับ: http://two.mongoid.org/docs/การคงอยู่/standard.html#destroy_all

ลบเอกสารที่ตรงกันทั้งหมดในฐานข้อมูลตามเงื่อนไขที่ให้มา ดูส่วนเกณฑ์ในการลบเพื่อดูวิธีที่ต้องการในการดำเนินการเหล่านี้ สิ่งนี้จะทำลายการโทรกลับในเอกสารที่ตรงกันทั้งหมด

ฉันเดาว่าหากคุณต้องการลบลูก ๆ เช่นกันคุณจะต้องระบุมันด้วยตนเองเนื่องจาก MongoDB ไม่มีพฤติกรรมเชิงสัมพันธ์ดังนั้นจึงไม่มีความสามารถในการเรียงซ้อน "ความสัมพันธ์" ของคุณด้วยตัวเอง

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

person Sammaye    schedule 16.10.2012

คุณจะต้องเพิ่ม:

:dependent => :destroy

ให้กับสมาคมของคุณ

ดู "พฤติกรรมที่ต้องพึ่งพา": http://two.mongoid.org/docs/relations/referenced/1-n.html

person Roman    schedule 17.10.2012