MongoDB: วิธีการอัพเดทเอกสารหลายชุดด้วยคำสั่งเดียว?


145

ฉันประหลาดใจที่พบว่าโค้ดตัวอย่างต่อไปนี้อัปเดตเอกสารเดียวเท่านั้น:

> db.test.save({"_id":1, "foo":"bar"});
> db.test.save({"_id":2, "foo":"bar"});

> db.test.update({"foo":"bar"}, {"$set":{"test":"success!"}});

> db.test.find({"test":"success!"}).count();
1

ฉันรู้ว่าฉันสามารถวนซ้ำและอัปเดตต่อไปจนกว่าพวกเขาจะเปลี่ยนไปทั้งหมด แต่ดูเหมือนว่าจะไม่มีประสิทธิภาพมากนัก มีวิธีที่ดีกว่า?

คำตอบ:


247

มีการอัปเดตหลายอัปเดตเมื่อเร็ว ๆ นี้ดังนั้นจะมีเฉพาะในรุ่นที่พัฒนา (1.1.3) จากเชลล์คุณทำการอัปเดตหลาย ๆ ครั้งโดยส่งผ่านtrueเป็นอาร์กิวเมนต์ที่สี่ถึงupdate()โดยที่อาร์กิวเมนต์ที่สามคืออาร์กิวเมนต์ upsert:

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, false, true);

สำหรับรุ่น mongodb 2.2+ คุณจำเป็นต้องตั้งค่าตัวเลือกหลายค่าจริงเพื่ออัปเดตเอกสารหลายรายการพร้อมกัน

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, {multi: true})

สำหรับรุ่น mongodb 3.2+ คุณยังสามารถใช้วิธีการใหม่updateMany()เพื่ออัปเดตเอกสารหลายรายการพร้อมกันโดยไม่จำเป็นต้องใช้multiตัวเลือกแยกต่างหาก

db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})

3
ฉันไม่แน่ใจว่าเมื่อการเปลี่ยนแปลงนี้เกิดขึ้น แต่ Mongodb v2.2.2 ทำสิ่งนี้แตกต่างกันเล็กน้อย db.collection.update (<query>, <update>, <options>) โดยตัวเลือกคือชุดของคู่ของคีย์ - ค่า ดูเอกสาร: docs.mongodb.org/manual/applications/update
TechplexEngineer

3
จะทำอย่างไรถ้าฉันต้องการตั้งค่าต่าง ๆ ให้กับเอกสารอื่น มีวิธีการทำอย่างนี้หรือไม่?
ซั

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

34

การเริ่มต้นใน v3.3 คุณสามารถใช้ updateMany ได้

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

ใน v2.2 ฟังก์ชั่นอัพเดทใช้รูปแบบต่อไปนี้:

 db.collection.update(
   <query>,
   <update>,
   { upsert: <boolean>, multi: <boolean> }
)

https://docs.mongodb.com/manual/reference/method/db.collection.update/


16

สำหรับรุ่น Mongo> 2.2ให้เพิ่มเขตข้อมูลแบบหลายค่าและตั้งค่าเป็นจริง

db.Collection.update({query}, 
                 {$set: {field1: "f1", field2: "f2"}},
                 {multi: true })

7

ฉันได้สร้างวิธีการทำสิ่งนี้ด้วยส่วนต่อประสานที่ดี

  • db.collection.find({ ... }).update({ ... }) - อัปเดตหลายรายการ
  • db.collection.find({ ... }).replace({ ... }) - ทดแทนเดียว
  • db.collection.find({ ... }).upsert({ ... }) - upsert เดียว
  • db.collection.find({ ... }).remove() - ลบหลาย

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

หากคุณสนใจลองดูMongo-Hacker


1
TypeError: db.getCollection (... ). find (... ). update ไม่ใช่ฟังก์ชั่น:?
Anthony

ไม่ทำงาน db.userActivity.find({ 'appId' : 1234, 'status' : 1}).update({ $set: { 'status': 1 } }); 2017-06-05T17:47:10.038+0530 E QUERY [thread1] TypeError: db.userActivity.find(...).update is not a function :
Prakash Pandey

4

ในไคลเอ็นต์ MongoDB ให้พิมพ์:

db.Collection.updateMany({}, $set: {field1: 'field1', field2: 'field2'})

ใหม่ในเวอร์ชัน 3.2

params ::

{}:  select all records updated

multiไม่ได้ใช้อาร์กิวเมนต์คำหลัก


3

MongoDB จะค้นหาเอกสารการจับคู่เพียงเอกสารเดียวที่ตรงกับเกณฑ์การสืบค้นเมื่อคุณออกคำสั่งการอัปเดตเอกสารใดที่ตรงกับครั้งแรกที่เกิดขึ้นจะได้รับการอัปเดตแม้ว่าจะมีเอกสารอื่นที่ตรงกับเกณฑ์นั้นก็ตาม

เพื่อที่จะเอาชนะสิ่งนี้เราสามารถระบุตัวเลือก "MULTI" ในคำสั่งอัปเดตของคุณซึ่งหมายถึงอัปเดตเอกสารทั้งหมดที่ตรงกับเกณฑ์การสืบค้น สแกนหาเอกสารทั้งหมดในการรวบรวมค้นหาสิ่งที่ตรงกับเกณฑ์และอัปเดต:

db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )

2

คำสั่งต่อไปนี้สามารถอัปเดตหลายรายการของคอลเลกชัน

db.collection.update({}, 
{$set:{"field" : "value"}}, 
{ multi: true, upsert: false}
)

1

ฉันมีปัญหาเดียวกันและฉันพบวิธีแก้ปัญหาและใช้งานได้เหมือนมีเสน่ห์

เพียงตั้งค่าสถานะมัลติเป็นจริงเช่นนี้:

 db.Collection.update(
                {_id_receiver: id_receiver},
               {$set: {is_showed: true}},
                {multi: true}   /* --> multiple update */
            , function (err, updated) {...});

ฉันหวังว่าจะช่วย :)


1

ในการอัปเดตคอลเล็กชันทั้งหมด

db.getCollection('collection_name').update({},
{$set: {"field1" : "value1", "field2" : "value2", "field3" : "value3"}},
{multi: true })

0

คุณสามารถใช้. '

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

0

mongodb รุ่นล่าสุดทั้งหมดupdateMany ()ทำงานได้ดี

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});

-1

ขอบคุณที่แบ่งปันสิ่งนี้ฉันใช้กับ 2.6.7 และแบบสอบถามต่อไปนี้ใช้งานได้

สำหรับเอกสารทั้งหมด:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:true})

สำหรับเอกสารเดี่ยว:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.