মঙ্গুজ (মংডোব) ব্যাচ inোকানো?


114

মঙ্গুজ v3.6 + কি এখন সমর্থন ব্যাচ টিপে? আমি কয়েক মিনিট সন্ধান করেছি কিন্তু এই প্রশ্নের সাথে মিলে যাওয়া কিছু মিলিয়ে কয়েক বছরের পুরানো এবং উত্তরটি ছিল একটি স্পষ্ট নং।

সম্পাদনা:

ভবিষ্যতের রেফারেন্সের জন্য, উত্তরটি ব্যবহার করতে হবে Model.create()create()অ্যারেটিকে তার প্রথম আর্গুমেন্ট হিসাবে গ্রহণ করে, তাই আপনি অ্যারে হিসাবে documentsোকানোর জন্য আপনার দস্তাবেজগুলি পাস করতে পারেন।

দেখুন Model.create () ডকুমেন্টেশন


আগের প্রশ্নের এই উত্তরটি দেখুন ।
জনিএইচকে

ধন্যবাদ। পোস্টিংয়ের পরে এটিই আমি খুঁজে পেয়েছি।
জিউইস

@ জিউস দয়া করে উত্তর হিসাবে আপনার সম্পাদনা যুক্ত করুন এবং আপনার প্রশ্নের সমাধানের জন্য এটি গ্রহণ করুন।
ফিলিপ দুপানোভিć


Model.create () ধীরে ধীরে এবং যদি আপনি বিপুল সংখ্যক নথি সন্নিবেশ করানোর বিষয়টি বিবেচনা করেন তবে পরিবর্তে এই পদ্ধতিটি গ্রহণ করা ভাল ।
লুসিও পাইভা

উত্তর:


162

Model.create () বনাম Model.collection.insert (): একটি দ্রুত পন্থা

Model.create()যদি আপনি খুব বড় পরিমাণে বাল্ক ব্যবহার করছেন তবে সন্নিবেশ করানো একটি খারাপ উপায়। এটা খুব ধীর হবেModel.collection.insertসেক্ষেত্রে আপনার ব্যবহার করা উচিত , যা আরও ভাল পারফর্ম করে । আকারের উপর নির্ভর করে বাল্ক আকার, Model.create()এমনকি ক্রাশ হবে! মিলিয়ন ডকুমেন্ট নিয়ে চেষ্টা করেছি, ভাগ্য নেই। Model.collection.insertএটি ব্যবহার করতে কয়েক সেকেন্ড সময় নিয়েছে।

Model.collection.insert(docs, options, callback)
  • docs documentsোকাতে হবে নথির অ্যারে;
  • optionsএকটি alচ্ছিক কনফিগারেশন অবজেক্ট - ডক্স দেখুন
  • callback(err, docs)সমস্ত নথি সংরক্ষণ করা বা ত্রুটি দেখা দেওয়ার পরে কল করা হবে। সাফল্যের সাথে ডক্স হ'ল অবিরাম নথির অ্যারে।

মঙ্গুজের লেখক যেমন এখানে উল্লেখ করেছেন , এই পদ্ধতিটি কোনও বৈধতা প্রক্রিয়া বাইপাস করবে এবং মঙ্গো ড্রাইভারকে সরাসরি অ্যাক্সেস করবে। আপনি একটি প্রচুর পরিমাণে ডেটা পরিচালনা করছেন, তাই এটি আপনাকে বানিয়ে ফেলতে হবে, অন্যথায় আপনি এটিকে আপনার ডাটাবেসে সন্নিবেশ করতে সক্ষম হবেন না (মনে রাখবেন আমরা এখানে কয়েক হাজার ডকুমেন্টের কথা বলছি)।

একটি সহজ উদাহরণ

var Potato = mongoose.model('Potato', PotatoSchema);

var potatoBag = [/* a humongous amount of potato objects */];

Potato.collection.insert(potatoBag, onInsert);

function onInsert(err, docs) {
    if (err) {
        // TODO: handle error
    } else {
        console.info('%d potatoes were successfully stored.', docs.length);
    }
}

আপডেট 2019-06-22 : insert()এখনও ঠিক জরিমানা ব্যবহার করা যেতে পারে, এটির পক্ষে অবমূল্যায়ন করা হয়েছে insertMany()। প্যারামিটারগুলি হুবহু এক, তাই আপনি এটি কেবল ড্রপ-ইন প্রতিস্থাপন হিসাবে ব্যবহার করতে পারেন এবং সবকিছু ঠিকঠাক কাজ করা উচিত (ভাল, ফেরতের মানটি কিছুটা আলাদা তবে আপনি সম্ভবত এটি ব্যবহার করছেন না)।

উল্লেখ



মঙ্গুসের সাথে উদাহরণ দিন Please
স্টিভ কে

15
যেহেতু Model.collectionসরাসরি মঙ্গো ড্রাইভারের মধ্য দিয়ে যায় তাই আপনি বৈধতা এবং হুকস সহ সমস্ত ঝরঝরে মঙ্গুসের জিনিস হারাবেন। কিছু মনে রাখবেন। Model.createহুক হারিয়েছে, কিন্তু এখনও বৈধতা দিয়ে যায়। আপনি যদি এই new MyModel()
সমস্তটি

1
@ পিয়র-লাকজেন্ড্রিউ আপনি একেবারেই সঠিক, তবে আপনি যখন প্রচুর পরিমাণে ডেটা নিয়ে কাজ শুরু করেন তখন এটি আপনাকে তৈরি করতে হবে।
লুসিও পাইভা

1
নতুন পাঠকদের জন্য সতর্ক থাকুন: "সংস্করণ ২.6 এ পরিবর্তিত হয়েছে: সন্নিবেশ () অপারেশনটির স্থিতি সম্বলিত একটি বস্তু প্রদান করে"। আর ডক্স নেই।
মার্ক এন

117

মঙ্গুজ ৪.৪.০ এখন বাল্ক সন্নিবেশ সমর্থন করে

মঙ্গুজ ৪.৪.০ মডেল পদ্ধতির সাথে --true-- বাল্ক সন্নিবেশ করিয়েছে .insertMany()। এটি লুপিং করা .create()বা অ্যারের সাথে সরবরাহের চেয়ে অনেক দ্রুত ।

ব্যবহার:

var rawDocuments = [/* ... */];

Book.insertMany(rawDocuments)
    .then(function(mongooseDocuments) {
         /* ... */
    })
    .catch(function(err) {
        /* Error handling */
    });

অথবা

Book.insertMany(rawDocuments, function (err, mongooseDocuments) { /* Your callback function... */ });

আপনি এটি ট্র্যাক করতে পারেন:


2
এই সময়ে, এই পদ্ধতিটি বিকল্পগুলি সমর্থন করে না।
আম্রি

উত্তরের জন্য ধন্যবাদ. কাঁচা দলিলগুলির বিশ্লেষণের জায়গায় কোনও ধারণা থাকা উচিত? আমি এটি জসন অবজেক্টগুলির একটি অ্যারে দিয়ে চেষ্টা করেছি এবং এটি কেবল allোকানো হয়েছে কেবল তাদের আইডি। :(
ওন্দ্রেজ টোকর

4
এটি কিভাবে আলাদা bulkWrite? এখানে দেখুন: স্ট্যাকওভারফ্লো.com
প্রশ্নগুলি

insertMany আমার জন্য কাজ করে না। আমি পেয়েছি একটি fatal error allocation failed। তবে আমি যদি ক্যালকেশন.সেটারেট ব্যবহার করি তবে এটি পুরোপুরি কার্যকর হয়।
জন

এটি কি মঙ্গুজ স্কিমা সরবরাহ করে এমন অতিরিক্ত জিনিসগুলির সাথে কাজ করবে? প্রাক্তন কোনও তারিখ না থাকলে ডেটা যুক্ত করবেdateCreated : { type: Date, default: Date.now },
জ্যাক ফাঁকা

22

প্রকৃতপক্ষে, আপনি মঙ্গুজের "তৈরি" পদ্ধতিটি ব্যবহার করতে পারেন, এতে নথির একটি অ্যারে থাকতে পারে, উদাহরণটি দেখুন:

Candy.create({ candy: 'jelly bean' }, { candy: 'snickers' }, function (err, jellybean, snickers) {
});

কলব্যাক ফাংশনে সন্নিবেশিত নথি রয়েছে। আপনি সর্বদা জানেন না কতগুলি আইটেম beোকাতে হবে (উপরের মতো স্থির যুক্তির দৈর্ঘ্য) যাতে আপনি সেগুলি লুপ করতে পারেন:

var insertedDocs = [];
for (var i=1; i<arguments.length; ++i) {
    insertedDocs.push(arguments[i]);
}

আপডেট: একটি ভাল সমাধান

উপরের উদাহরণে ব্যবহৃত - এর Candy.collection.insert()পরিবর্তে আরও ভাল সমাধান ব্যবহার করা উচিত Candy.create()- কারণ এটি দ্রুত ( প্রতিটি আইটেমে create()কল Model.save()করছে তাই এটি ধীর)।

আরও তথ্যের জন্য মঙ্গো ডকুমেন্টেশন দেখুন: http://docs.mongodb.org/manual/reference/method/db.collection.insert/

(এটি নির্দেশ করার জন্য আর্কসেল্ডনকে ধন্যবাদ )


groups.google.com/forum/#!topic/mongoose-orm/IkPmvcd0kds - আপনি যা চান তার উপর নির্ভর করে লিঙ্কটির আরও ভাল বিকল্প রয়েছে।
আর্সেল্ডন

আপনি এর {type:'jellybean'}পরিবর্তে মানে না {type:'jelly bean'}? BTW। সেগুলি কী অদ্ভুত? তারা মঙ্গুজ এপিআই এর অংশ?
স্টিভ কে

2
ওয়েল এটি তখন একটি নামকরণের বাছাই পছন্দ, যেহেতু typeসাধারণত একটি ডেটাবেস অবজেক্টের এডিটি চিহ্নিত করার জন্য মঙ্গুজে সংরক্ষিত থাকে।
স্টিভ কে

2
@ সিরবেনবেনজি আমি এটি পরিবর্তন করেছি, তবে এটি সরকারী নথিতেও একটি উদাহরণ ছিল। আমি মনে করি এটির জন্য ডাউনওয়েট করা দরকার ছিল না।
বেনসেকে

1
সংগ্রহের সম্পত্তিটিকে সম্বোধন করে আপনি মঙ্গুজকে বৈধ করছেন (বৈধকরণ, 'প্রাক' পদ্ধতিগুলি ...)
ডেরেক

4

আপনি একটি অ্যারের মধ্যে মান সন্নিবেশ করে মোঙ্গোডিবি শেল ব্যবহার করে বাল্ক সন্নিবেশ সম্পাদন করতে পারেন।

db.collection.insert([{values},{values},{values},{values}]);

বাল্ক sertোকানোর জন্য কি মঙ্গুজে কোনও উপায় আছে?
সুন্দ্রারাজান কে

1
YourModel.collection.insert()
বিল দামি

সংগ্রহের সম্পত্তিটিকে সম্বোধন করে আপনি মঙ্গুজকে বৈধ করছেন (বৈধতা, 'প্রাক' পদ্ধতিগুলি ...)
ডেরেক

এটি মঙ্গুজ নয়, এবং এই উত্তরের কয়েক সপ্তাহ আগে কাঁচা collection.insertউত্তর দেওয়া হয়েছিল এবং আরও বিস্তারিতভাবে ব্যাখ্যা করেছিলেন।
ড্যান ড্যাসকলেসকু

4

আপনি সর্বোচ্চ স্কোর উত্তর হিসাবে মঙ্গুজ ব্যবহার করে বাল্ক সন্নিবেশ সম্পাদন করতে পারেন। তবে উদাহরণটি কাজ করতে পারে না, এটি হওয়া উচিত:

/* a humongous amount of potatos */
var potatoBag = [{name:'potato1'}, {name:'potato2'}];

var Potato = mongoose.model('Potato', PotatoSchema);
Potato.collection.insert(potatoBag, onInsert);

function onInsert(err, docs) {
    if (err) {
        // TODO: handle error
    } else {
        console.info('%d potatoes were successfully stored.', docs.length);
    }
}

বাল্ক সন্নিবেশের জন্য কোনও স্কিমা উদাহরণ ব্যবহার করবেন না, আপনার একটি সরল মানচিত্রের অবজেক্টটি ব্যবহার করা উচিত।


প্রথম উত্তরটি ভুল নয়, এটির বৈধতা রয়েছে
লুকা স্টেব

1
সংগ্রহের সম্পত্তিটিকে সম্বোধন করে আপনি মঙ্গুজকে ছাড়িয়ে যাচ্ছেন (বৈধতা, 'প্রাক' পদ্ধতিগুলি ...)
ডেরেক

4

এখানে ইনসার্টম্যানি এবং সেভ দিয়ে ডেটা সংরক্ষণের উভয় উপায় রয়েছে

1) নকুল দস্তাবেজ অ্যারে সংরক্ষণ insertManyবাল্ক মধ্যে

/* write mongoose schema model and export this */
var Potato = mongoose.model('Potato', PotatoSchema);

/* write this api in routes directory  */
router.post('/addDocuments', function (req, res) {
    const data = [/* array of object which data need to save in db */];

    Potato.insertMany(data)  
    .then((result) => {
            console.log("result ", result);
            res.status(200).json({'success': 'new documents added!', 'data': result});
    })
    .catch(err => {
            console.error("error ", err);
            res.status(400).json({err});
    });
})

2) মঙ্গুজ এর সাথে নথিগুলির অ্যারে সংরক্ষণ করুন save .save()

এই নথিগুলি সমান্তরাল সংরক্ষণ করবে save

/* write mongoose schema model and export this */
var Potato = mongoose.model('Potato', PotatoSchema);

/* write this api in routes directory  */
router.post('/addDocuments', function (req, res) {
    const saveData = []
    const data = [/* array of object which data need to save in db */];
    data.map((i) => {
        console.log(i)
        var potato = new Potato(data[i])
        potato.save()
        .then((result) => {
            console.log(result)
            saveData.push(result)
            if (saveData.length === data.length) {
                res.status(200).json({'success': 'new documents added!', 'data': saveData});
            }
        })
        .catch((err) => {
            console.error(err)
            res.status(500).json({err});
        })
    })
})

3

মনে হয় যে মঙ্গুজ ব্যবহার করার সময় 1000 টিরও বেশি নথির সীমা রয়েছে

Potato.collection.insert(potatoBag, onInsert);

তুমি ব্যবহার করতে পার:

var bulk = Model.collection.initializeOrderedBulkOp();

async.each(users, function (user, callback) {
    bulk.insert(hash);
}, function (err) {
    var bulkStart = Date.now();
    bulk.execute(function(err, res){
        if (err) console.log (" gameResult.js > err " , err);
        console.log (" gameResult.js > BULK TIME  " , Date.now() - bulkStart );
        console.log (" gameResult.js > BULK INSERT " , res.nInserted)
      });
});

10000 নথি পরীক্ষা করার সময় এটি প্রায় দ্বিগুণ দ্রুত:

function fastInsert(arrOfResults) {
var startTime = Date.now();
    var count = 0;
    var c = Math.round( arrOfResults.length / 990);

    var fakeArr = [];
    fakeArr.length = c;
    var docsSaved = 0

    async.each(fakeArr, function (item, callback) {

            var sliced = arrOfResults.slice(count, count+999);
            sliced.length)
            count = count +999;
            if(sliced.length != 0 ){
                    GameResultModel.collection.insert(sliced, function (err, docs) {
                            docsSaved += docs.ops.length
                            callback();
                    });
            }else {
                    callback()
            }
    }, function (err) {
            console.log (" gameResult.js > BULK INSERT AMOUNT: ", arrOfResults.length, "docsSaved  " , docsSaved, " DIFF TIME:",Date.now() - startTime);
    });
}

1
সংগ্রহের সম্পত্তিটিকে সম্বোধন করে আপনি মঙ্গুজকে বৈধ করছেন (বৈধতা, 'প্রাক' পদ্ধতিগুলি ...)
ডেরেক

0

আমাদের প্রকল্প থেকে কার্যকরী ও প্রাসঙ্গিক কোড ভাগ করা:

//documentsArray is the list of sampleCollection objects
sampleCollection.insertMany(documentsArray)  
    .then((res) => {
        console.log("insert sampleCollection result ", res);
    })
    .catch(err => {
        console.log("bulk insert sampleCollection error ", err);
    });

.insertManyসমাধান ইতিমধ্যে দেওয়া হয়েছিল (এবং ব্যাখ্যা) এই মধ্যে 2016 উত্তর
ড্যান ড্যাসকলেসকু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.