MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

mongoDb संग्रह के प्रत्येक दस्तावेज़ की समान संपत्ति को अलग-अलग मानों के साथ अपडेट करें

आप मूल रूप से bulkWrite() चाहते हैं , जो वस्तुओं की इनपुट सरणी ले सकता है और मिलान किए गए दस्तावेज़ों को अद्यतन करने के अनुरोधों का "बैच" बनाने के लिए इसका उपयोग कर सकता है।

मान लें कि दस्तावेज़ों की सरणी req.body.updates . में भेजी जा रही है , तो आपके पास कुछ ऐसा होगा

const Model = require('../models/model');

router.post('/update', (req,res) => {
  Model.bulkWrite(
    req.body.updates.map(({ slno, name }) => 
      ({
        updateOne: {
          filter: { slno },
          update: { $set: { name } }
        }
      })
    )
  })
  .then(result => {
    // maybe do something with the WriteResult
    res.send("ok"); // or whatever response
  })
  .catch(e => {
    // do something with any error
  })
})

यह इनपुट दिए गए अनुरोध को इस प्रकार भेजता है:

bulkWrite([
   { updateOne: { filter: { slno: 1 }, update: { '$set': { name: 'Item 3' } } } },
   { updateOne: { filter: { slno: 2 }, update: { '$set': { name: 'Item 1' } } } },
   { updateOne: { filter: { slno: 3 }, update: { '$set': { name: 'Item 2' } } } } ]
)

जो एक ही प्रतिक्रिया के साथ सर्वर से एक ही अनुरोध में सभी अपडेट कुशलतापूर्वक करता है।

bulkWrite()<पर मुख्य MongoDB दस्तावेज़ भी देखें। /कोड> . यह mongo . के लिए दस्तावेज़ है शेल विधि, लेकिन अधिकांश ड्राइवरों में और विशेष रूप से सभी जावास्क्रिप्ट आधारित ड्राइवरों में सभी विकल्प और सिंटैक्स बिल्कुल समान हैं।

नेवले के साथ प्रयोग में आने वाली विधि के पूर्ण कार्य प्रदर्शन के रूप में:

const { Schema } = mongoose = require('mongoose');

const uri = 'mongodb://localhost/test';

mongoose.Promise = global.Promise;
mongoose.set('debug',true);

const testSchema = new Schema({
  slno: Number,
  name: String
});

const Test = mongoose.model('Test', testSchema);

const log = data => console.log(JSON.stringify(data, undefined, 2));

const data = [1,2,3].map(n => ({ slno: n, name: `Item ${n}` }));

const request = [[1,3],[2,1],[3,2]]
  .map(([slno, n]) => ({ slno, name: `Item ${n}` }));

mongoose.connect(uri)
  .then(conn =>
    Promise.all(Object.keys(conn.models).map( k => conn.models[k].remove()))
  )
  .then(() => Test.insertMany(data))
  .then(() => Test.bulkWrite(
    request.map(({ slno, name }) =>
      ({ updateOne: { filter: { slno }, update: { $set: { name } } } })
    )
  ))
  .then(result => log(result))
  .then(() => Test.find())
  .then(data => log(data))
  .catch(e => console.error(e))
  .then(() => mongoose.disconnect());

या अधिक आधुनिक परिवेशों के लिए async/प्रतीक्षा . के साथ :

const { Schema } = mongoose = require('mongoose');

const uri = 'mongodb://localhost/test';

mongoose.Promise = global.Promise;
mongoose.set('debug',true);

const testSchema = new Schema({
  slno: Number,
  name: String
});

const Test = mongoose.model('Test', testSchema);

const log = data => console.log(JSON.stringify(data, undefined, 2));

const data = [1,2,3].map(n => ({ slno: n, name: `Item ${n}` }));

const request = [[1,3],[2,1],[3,2]]
  .map(([slno,n]) => ({ slno, name: `Item ${n}` }));

(async function() {

  try {

    const conn = await mongoose.connect(uri)

    await Promise.all(Object.entries(conn.models).map(([k,m]) => m.remove()));

    await Test.insertMany(data);
    let result = await Test.bulkWrite(
      request.map(({ slno, name }) =>
        ({ updateOne: { filter: { slno }, update: { $set: { name } } } })
      )
    );
    log(result);

    let current = await Test.find();
    log(current);

    mongoose.disconnect();

  } catch(e) {
    console.error(e)
  } finally {
    process.exit()
  }

})()

जो प्रारंभिक डेटा लोड करता है और फिर अद्यतन करता है, प्रतिक्रिया वस्तु (क्रमबद्ध) और अद्यतन संसाधित होने के बाद संग्रह में परिणामी आइटम दिखाता है:

Mongoose: tests.remove({}, {})
Mongoose: tests.insertMany([ { _id: 5b1b89348f3c9e1cdb500699, slno: 1, name: 'Item 1', __v: 0 }, { _id: 5b1b89348f3c9e1cdb50069a, slno: 2, name: 'Item 2', __v: 0 }, { _id: 5b1b89348f3c9e1cdb50069b, slno: 3, name: 'Item 3', __v: 0 } ], {})
Mongoose: tests.bulkWrite([ { updateOne: { filter: { slno: 1 }, update: { '$set': { name: 'Item 3' } } } }, { updateOne: { filter: { slno: 2 }, update: { '$set': { name: 'Item 1' } } } }, { updateOne: { filter: { slno: 3 }, update: { '$set': { name: 'Item 2' } } } } ], {})
{
  "ok": 1,
  "writeErrors": [],
  "writeConcernErrors": [],
  "insertedIds": [],
  "nInserted": 0,
  "nUpserted": 0,
  "nMatched": 3,
  "nModified": 3,
  "nRemoved": 0,
  "upserted": [],
  "lastOp": {
    "ts": "6564991738253934601",
    "t": 20
  }
}
Mongoose: tests.find({}, { fields: {} })
[
  {
    "_id": "5b1b89348f3c9e1cdb500699",
    "slno": 1,
    "name": "Item 3",
    "__v": 0
  },
  {
    "_id": "5b1b89348f3c9e1cdb50069a",
    "slno": 2,
    "name": "Item 1",
    "__v": 0
  },
  {
    "_id": "5b1b89348f3c9e1cdb50069b",
    "slno": 3,
    "name": "Item 2",
    "__v": 0
  }
]

वह सिंटैक्स का उपयोग कर रहा है जो NodeJS v6.x के साथ संगत है



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्रिप्टो pbkdf2 को mongoDB में कैसे स्टोर करें?

  2. नेस्टेड सरणी mongodb से तत्व निकालें

  3. मोंगोडब अपरर्ट डुप्लीकेटकीएक्सप्शन फेंक रहा है

  4. MongoDB को डबल नेस्टेड सरणी के अंदर अधिकतम तिथि मिलती है

  5. एकल क्वेरी में मोंगोडब में 2 संग्रह से डेटा प्राप्त करें