MongoDB: อัปเดตเอกสารทุกฉบับในฟิลด์เดียว


214

ฉันมีการรวบรวมชื่อfooสมมุติ

แต่ละอินสแตนซ์ของfooมีเขตข้อมูลที่เรียกว่า lastLookedAt ซึ่งเป็นเวลาประทับ UNIX ตั้งแต่ยุค ฉันต้องการผ่าน MongoDB ไคลเอนต์และตั้งค่าการประทับเวลานั้นสำหรับเอกสารที่มีอยู่ทั้งหมด (ประมาณ 20,000 รายการ) เป็นการประทับเวลาปัจจุบัน

วิธีที่ดีที่สุดในการจัดการกับสิ่งนี้คืออะไร?


คำตอบ:


458

ไม่ว่าจะเป็นเวอร์ชั่นใดสำหรับตัวอย่างของคุณ<update>คือ:

{  $set: { lastLookedAt: Date.now() / 1000 }  }

อย่างไรก็ตามขึ้นอยู่กับรุ่นของ MongoDB ของคุณแบบสอบถามจะดูแตกต่างออกไป โดยไม่คำนึงถึงรุ่นที่สำคัญคือสภาพที่ว่างเปล่า{}จะตรงกับเอกสารใดในเชลล์ Mongo หรือกับไคลเอนต์ MongoDB:

$ version> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} เป็นเงื่อนไข (เงื่อนไขว่างตรงกับเอกสารใด ๆ )

3.2> $ version> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} เป็นเงื่อนไข (เงื่อนไขว่างตรงกับเอกสารใด ๆ )
  • {multi: true} เป็นตัวเลือก "อัปเดตหลายเอกสาร"

$ version <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} เป็นเงื่อนไข (เงื่อนไขว่างตรงกับเอกสารใด ๆ )
  • falseใช้สำหรับพารามิเตอร์ " upsert "
  • true ใช้สำหรับพารามิเตอร์ "หลาย" (อัปเดตหลายระเบียน)

Date.now () ส่งคืนการประทับเวลาด้วย ดูdeveloper.mozilla.org/en/JavaScript/Reference/Global_Objects/ …
Philippe Plantier

มันยังคงให้วันที่ที่ไม่เหมาะสำหรับอินสแตนซ์ทั้งหมดของ foo หลังจากทำงานที่ฉันทำ db.foo.findOne () และ lastLookedAt คือ: 1327691719186 ซึ่งแปลเป็น jruby-1.6.5: 011> Time.at (1327691719186) => Sun Nov 16 02:19:46 -0500 44042
randombits

1
เวลา POSIX ของฉันไม่ดีใช้วินาทีในขณะที่เวลา Javascript ใช้มิลลิวินาที แม้ว่า Date.now () / 1,000 ควรใช้งานได้ คุณอาจต้องปัดเศษ
Philippe Plantier

psh มันว่างเปล่า {} ที่ทำเพื่อฉันขอบคุณ Phil
Jona

1
วิธีการทำเพื่อเก่าค่า + "สตริงบาง"
Mahesh K

11

รหัสนี้จะเป็นประโยชน์สำหรับคุณ

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  

4

ฉันใช้ MongoDB .NET ไดรเวอร์มานานกว่าหนึ่งเดือนแล้ว ถ้าฉันจะทำโดยใช้ไดรเวอร์. NET ฉันจะใช้วิธีการอัปเดตบนวัตถุคอลเลกชัน ก่อนอื่นฉันจะสร้างแบบสอบถามที่จะให้เอกสารทั้งหมดที่ฉันสนใจและทำการอัปเดตในฟิลด์ที่ฉันต้องการเปลี่ยน การอัปเดตใน Mongo จะมีผลกับเอกสารแรกเท่านั้นและเพื่ออัปเดตเอกสารทั้งหมดที่เป็นผลจากแบบสอบถามหนึ่งต้องใช้การตั้งค่าสถานะการอัปเดต 'หลาย' โค้ดตัวอย่างต่อไปนี้ ...

var collection = db.GetCollection("Foo");
var query = Query.GTE("No", 1); // need to construct in such a way that it will give all 20K //docs.
var update = Update.Set("timestamp", datetime.UtcNow);
collection.Update(query, update, UpdateFlags.Multi);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.