مونغو دي بي:كيفية تحديث مستندات متعددة بأمر واحد؟

StackOverflow https://stackoverflow.com/questions/1740023

  •  20-09-2019
  •  | 
  •  

سؤال

لقد فوجئت عندما وجدت أن رمز المثال التالي يقوم فقط بتحديث مستند واحد:

> 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

أعلم أنه يمكنني الاستمرار في التحديث ومواصلة التحديث حتى يتم تغييرها جميعًا، لكن هذا يبدو غير فعال على الإطلاق.هل هناك طريقة أفضل؟

هل كانت مفيدة؟

المحلول

تمت إضافة التحديث المتعدد مؤخرًا، لذا فهو متاح فقط في إصدارات التطوير (1.1.3).من الصدفة تقوم بإجراء تحديث متعدد عن طريق المرور true كالحجة الرابعة ل update(), ، حيث تكون الوسيطة الثالثة هي الوسيطة upsert:

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

بالنسبة لإصدارات mongodb 2.2+، تحتاج إلى تعيين الخيار multi true لتحديث مستندات متعددة في وقت واحد.

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

بالنسبة لإصدارات mongodb 3.2+، يمكنك أيضًا استخدام الطريقة الجديدة updateMany() لتحديث وثائق متعددة في وقت واحد، دون الحاجة إلى وثائق منفصلة multi خيار.

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

نصائح أخرى

UPDATE اعتبارًا من الإصدار 2.2، تأخذ وظيفة التحديث النموذج التالي:

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

الإجابة المحددة لم تعد تنطبق.

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

ل<القوي> نسخة مونجو> 2.2 ، أو إضافة متعددة الميدان وتعيينها إلى true

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

لقد قمت بإنشاء طريقة للقيام بذلك من خلال واجهة أفضل.

  • db.collection.find({ ... }).update({ ... }) - تحديث متعدد
  • db.collection.find({ ... }).replace({ ... }) - استبدال فردي
  • db.collection.find({ ... }).upsert({ ... }) - مفاجأة واحدة
  • db.collection.find({ ... }).remove() - إزالة متعددة

يمكنك أيضًا تطبيق الحد على التحديثات وتخطيها وفرزها وإزالتها عن طريق ربطها مسبقًا.

إذا كنت مهتما، تحقق من مونجو هاكر

في العميل MongoDB، اكتب:

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

والجديد في الإصدار 3.2

وبارامس ::

{}:  select all records updated

وكلمة حجة multi لم تتخذ

وMongoDB سوف تجد سوى وثيقة المطابقة واحد والذي يطابق معايير الاستعلام عند إصدار أمر التحديث، أيهما المباريات ثيقة يحدث أول من الحصول على تحديث، حتى لو كانت هناك المزيد من الوثائق التي تطابق سوف تحصل على تجاهل المعايير.

وذلك للتغلب على هذا يمكننا تحديد الخيار "MULTI" في بيان التحديث، وهذا يعني تحديث كل تلك documnets الذي يتطابق مع معايير الاستعلام. مسح لجميع documnets في جمع العثور على تلك التي تتوافق مع المعايير وتحديث:

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

وكان لي نفس المشكلة، ولقد وجدت الحل، وأنها تعمل مثل السحر

ومجرد مجموعة متعددة العلم إلى true مثل هذا:

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

وآمل أن يساعد:)

ويمكنك use.`

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

جميع الإصدارات الأخيرة من mongodb تحديث كثير () يعمل بشكل جيد

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

وشكرا لتقاسم هذه، كنت مع 2.6.7 والاستعلام التالي فقط عملت،

ولجميع المستندات:

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

وعن وثيقة واحدة:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top