ฉันยังใหม่กับ mongodb และเครียดมากเพราะเอกสารที่ไม่สมบูรณ์ของ mongodb ทำให้ฉันต้องลองผิดลองถูก... น่าเศร้าที่ความพยายามทั้งหมดของฉันไม่ได้ทำงานโดยไม่มีข้อผิดพลาด ทำให้ฉันสับสนเกี่ยวกับสิ่งที่เกิดขึ้นและสิ่งที่ต้องแก้ไข...
ฉันแค่ต้องอัปเดตหลายบันทึกในฐานข้อมูลที่ตรงกับเกณฑ์ที่กำหนด และสำหรับบันทึกที่ไม่มีอยู่ ให้สร้างรายการใหม่สำหรับสิ่งนั้น ฉันเชื่อว่าฉันสามารถทำได้ด้วยการเข้าถึงฐานข้อมูลเดียวพร้อมการอัพเดต upsert และหลายรายการ นี่คือสิ่งที่ฉันได้เกิดขึ้น:
dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { options: { upsert: true, multi: true } } );
ฉันได้ลองใช้ชุดค่าผสมหลายชุดหรือแม้แต่เวอร์ชันเก่าเช่น:
dbschema.Person.update( { person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { upsert: true }, { multi: true } );
ไม่ทำงานเลย...
โปรดช่วยฉันในเรื่องเล็กน้อยนี้ด้วย ... ฉันสามารถทำมันได้อย่างง่ายดายใน sql แต่สิ่งที่ nosql นั้นจำกัดฉันมาก .. ขอบคุณ!
แก้ไข:
แบบสอบถามเดียวกันในการค้นหาทำงานได้อย่างสมบูรณ์:
dbschema.Person.find( { person_id: { $in: ["734533604" ,"701084015"] } }, function ( err, results ) {
console.log( 'result: ' + results );
console.log( 'error: ' + err );
console.log( 'result length: ' + results.length );
} );
แก้ไข:
ฉันคาดหวังว่าจะสร้างบันทึก "ไม่พบ" และบันทึกที่พบจะได้รับการอัปเดต ตรรกะของฉันอาจมีข้อบกพร่อง และตอนนี้ฉันก็สับสนมาก
เดิมที ฉันค้นหา()-ing ครั้งละหนึ่งระเบียน เปลี่ยนค่า และเรียกว่า save() สำหรับแต่ละระเบียนที่แก้ไข แต่เมื่อฉันนำไปใช้งานจริง เวลาตอบสนองจะช้าลงหลายร้อยเท่า โดยเฉพาะอย่างยิ่งเมื่อมี มีการอัปเดตบันทึกไม่กี่ร้อยรายการในแต่ละคำขอ
จากนั้นฉันก็พบ find() + $in และประสิทธิภาพได้รับการกู้คืนและดียิ่งขึ้นกว่าเดิม (เมื่อทำการสืบค้น) แต่การอัปเดตยังคงช้าอย่างไม่อาจยอมรับได้.. ดังนั้นตอนนี้ฉันกำลังมองหาวิธีในการอัปเดตเอกสารทั้งหมดในแบบสอบถามเดียว .
สิ่งที่ฉันทำตามปกติใน SQL คือการใช้ UPDATE WHEN CASE THEN... เช่น:
UPDATE person SET score = CASE
WHEN person_id = "734533604" THEN 1200
WHEN person_id = "701084015" THEN 1200
ELSE
score
END