Mongoose (MongoDB) партыя ўставіць?

Ці ж цяпер Mongoose v3.6 + падтрымка пакетнай ўстаўкі? Я шукаў на працягу некалькіх хвілін, але нічога, адпаведнае гэты запыт з'яўляецца некалькімі гадоў, і адказ быў адназначным няма.

змяніць:

Для далейшага выкарыстання, адказ заключаецца ў выкарыстанні Model.create (). стварэнне() прымае масіў у якасці першага аргументу, так што вы можаце перадаць вашы дакументы, якія будуць устаўленыя ў выглядзе масіва.

See http://mongoosejs.com/docs/api.html#model_Model.create

89
Дзякуючы. Гэта тое, што я ў канчатковым выніку знайсці пасля размяшчэння.
дададзена аўтар Geuis, крыніца
дададзена аўтар arcseldon, крыніца
дададзена аўтар MarBVI, крыніца
См гэты адказ на папярэдняе пытанне.
дададзена аўтар JohnnyHK, крыніца
@Geuis калі ласка, дадайце вашыя змены ў адказ і прыняць яго, каб вырашыць пытанне.
дададзена аўтар Filip Dupanović, крыніца
Model.create() павольна, і калі вы плануеце ўставіць велізарная колькасць дакументаў, то лепш узяць гэты падыход замест гэтага.
дададзена аўтар Lucio Paiva, крыніца

9 адказы

Model.create() супраць Model.collection.insert (): больш хуткі падыход

Model.create() is a bad way to do inserts if you are dealing with a very large bulk. It will be very slow. In that case you should use Model.collection.insert, which performs much better. Depending on the size of the bulk, Model.create() will even crash! Tried with a million documents, no luck. Using Model.collection.insert it took just a few seconds.

Model.collection.insert(docs, options, callback)
  • docs is the array of documents to be inserted;
  • options is an optional configuration object - see the docs
  • callback(err, docs) will be called after all documents get saved or an error occurs. On success, docs is the array of persisted documents.

Як аўтар Mongoose паказваецца, тут , гэты метад будзе абыходзіць любыя працэдуры праверкі і атрымання доступу да Монго кіроўца непасрэдна. Гэта кампраміс вы павінны зрабіць, так як вы апрацоўкі вялікай колькасці дадзеных, у адваротным выпадку вы не зможаце ўставіць яго ў базу дадзеных на ўсіх (памятаеце, мы гаворым сотні тысяч дакументаў тут).

просты прыклад

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);
    }
}

спасылка

134
дададзена
Калі ласка, дайце прыклад з мангуста.
дададзена аўтар nottinhill, крыніца
groups.google.com/forum/#!topic/mongoose-orm/ IkPmvcd0kds кажа, што ўсё гэта на самой справе.
дададзена аўтар arcseldon, крыніца
Магчыма, лепшы спосаб дадаць тоны дадзеных: D
дададзена аўтар John, крыніца
@SirBenBenji Прыклад дадзена :-)
дададзена аўтар Lucio Paiva, крыніца
Дзякуючы @arcseldon. Дададзеная ваша спасылка ў якасці спасылкі.
дададзена аўтар Lucio Paiva, крыніца
@ П'ер-LucGendreau Вы абсалютна правы, але гэта кампраміс вы павінны зрабіць, як толькі вы пачынаеце справу з Humongous колькасцю дадзеных.
дададзена аўтар Lucio Paiva, крыніца
Так як Model.collection ідзе непасрэдна праз драйвер Монго, вы страціце ўсе акуратную мангуста рэчы, уключаючы праверкі і гаплікі. Проста нешта мець на ўвазе. <�Код> Model.create губляе гаплікі, але ўсё ж адбываецца праверку. Калі вы жадаеце ўсё гэта, вы павінны паўтараць і новы MyModel()
дададзена аўтар Pier-Luc Gendreau, крыніца
Вырашаючы .collection уласнасці вы абыходзячы Мангуст (праверкі, «папярэдне» метады ...). См іншага адказу для выкарыстання (новы метад роднага Mongoose) [ stackoverflow.com/a/35174701/1154241] .
дададзена аўтар Derek, крыніца
Будзьце ўважлівыя да новых чытачам: «Зменена ў версіі 2.6: устаўка() вяртае аб'ект, які змяшчае статус аперацыі». Няма больш Docs.
дададзена аўтар Mark Ni, крыніца

Мангуст 4.4.0 зараз падтрымлівае аб'ёмную ўстаўку

Mongoose 4.4.0 ўводзіць --true-- аб'ёмнай ўстаўкі з дапамогай метаду мадэлі .insertMany() . Гэта нашмат хутчэй, чым зацыкленне на .create() або прадастаўленне яе з масівам.

выкарыстанне:

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

Book.insertMany(rawDocuments)
    .then(function(mongooseDocuments) {
         /* ... */
    })
    .catch(function(err) {
        /* Errабо handling */
    });

або

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

Вы можаце адсочваць яго на:

89
дададзена
Ці будзе гэта працаваць з дадатковым матэрыялам, што мангуст схема забяспечвае? ех будзе гэта дадаць дадзеныя, калі дата не існуе dateCreated: {Тып: Дата, па змаўчанні: Date.now},
дададзена аўтар jack blank, крыніца
insertMany не працуе для мяне. Я атрымаў фатальным размеркаванне памылак не атрымалася . Але калі я выкарыстоўваю collection.insert Ён выдатна працуе.
дададзена аўтар John, крыніца
Як гэта адрозніваецца ад bulkWrite ? Глядзіце тут:
дададзена аўтар Ondrej Tokar, крыніца
Дзякуй за адказ. Любая ідэя, што сінтаксічны з rawDocuments павінны быць на месцы? Я паспрабаваў гэта масіў аб'ектаў JSON і ўсё гэта ўстаўлена было толькі іх ідэнтыфікатары. :(
дададзена аўтар Ondrej Tokar, крыніца
У гэты час, гэты метад не падтрымлівае параметры.
дададзена аўтар Amri, крыніца

На самай справе, вы можаце выкарыстоўваць метад «стварыць» з Mongoose, ён можа ўтрымліваць масіў дакументаў, см гэтага прыкладу:

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

Функцыя зваротнага выкліку ўтрымлівае устаўленыя дакументы. Вы не заўсёды ведаеце, колькі элементаў павінен быць устаўлены (фіксаваны аргумент даўжыні, як і вышэй), так што вы можаце цыкл праз іх:

var insertedDocs = [];
for (var i=1; i

Абнаўленне: Лепшае рашэнне

Лепшым рашэннем было б выкарыстоўваць Candy.collection.insert() замест Candy.create() - які выкарыстоўваецца ў прыкладзе вышэй - таму што гэта хутчэй ( стварыць ( ) кліча Model.save() па кожным пункце, так што гэта павольней).

See the Mongo documentation for more information: http://docs.mongodb.org/manual/reference/method/db.collection.insert/

(Дзякуючы arcseldon паказваюць на гэта)

22
дададзена
Не значыць {тып: 'Jellybean'} замест {тыпу: 'Jelly Bean'} ? Btw. якія дзіўныя тыпы тыя? Ці з'яўляюцца яны часткай Mongoose API?
дададзена аўтар nottinhill, крыніца
Ну, што гэта дрэнны выбар імёнаў, то, так як тып звычайна захоўваецца ў Mongoose для намініравання ў ADT аб'екта базы дадзеных.
дададзена аўтар nottinhill, крыніца
groups.google.com/forum/#!topic/mongoose-orm/ IkPmvcd0kds - у залежнасці ад таго, што вы хочаце, спасылка мае лепшы варыянт.
дададзена аўтар arcseldon, крыніца
@sirbenbenji я змяніў яго, але гэта быў прыклад таксама прысутнічае ў афіцыйнай дакументацыі. Не трэба было downvote для гэтага я думаю.
дададзена аўтар benske, крыніца
@SirBenBenji гэта проста прыклад аб'екта ...
дададзена аўтар benske, крыніца
Вырашаючы .collection уласнасці вы абыходзячы Mongoose (праверкі, метады «загадзя» ...)
дададзена аўтар Derek, крыніца

Вы можаце выканаць аб'ёмную ўстаўку з дапамогай абалонкі MongoDB з дапамогай ўстаўкі значэнняў у масіве.

db.collection.insert([{values},{values},{values},{values}]);
5
дададзена
<�Код> YourModel.collection.insert()
дададзена аўтар Bill Dami, крыніца
ёсць спосаб у мангуста для масавай ўстаўкі?
дададзена аўтар SUNDARRAJAN K, крыніца
Вырашаючы .collection уласнасці вы абыходзячы Mongoose (праверкі, метады «загадзя» ...)
дададзена аўтар Derek, крыніца

Вы можаце выканаць масавую ўстаўку з выкарыстаннем мангуста, як самы высокі бал адказу. Але прыклад не можа працаваць, ён павінен быць:

/* 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);
    }
}

Не выкарыстоўвайце асобнік схемы для масавай ўстаўкі, вы павінны выкарыстоўваць просты аб'ект карты.

3
дададзена
Першы адказ не так, ён проста мае праверку
дададзена аўтар Luca Steeb, крыніца
Вырашаючы .collection уласнасці вы абыходзячы Mongoose (праверкі, метады «загадзя» ...)
дададзена аўтар Derek, крыніца

Уяўляецца, што выкарыстанне мангуста ёсць мяжа больш за 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);
    });
}
3
дададзена
Вырашаючы .collection уласнасці вы абыходзячы Mongoose (праверкі, метады «загадзя» ...)
дададзена аўтар Derek, крыніца

Я выкарыстаў асінхронны-Foreach ( спасылку для асінхроннага-Foreach пакета дакументацыі нага ) для дасягнення тое ж самае.

Мой фрагмент кода, як below.I я атрымліваю дакументы ў req.body.

var forEach = require('async-foreach').forEach;    
exports.save_Ctrl = function (req, res) {    
//  var l=req.body;
//  console.log("length:",l.length);

 forEach(req.body, function(item, index, object,err) {

    console.log(req.body[index]);
    var post = new saveObj(req.body[index]);   

        //save model to MongoDB
    post.save(function (err) {
        if (err) {
            console.log('error saving :' + err.message);
            return err;
        }   
        else {
            console.log("Post saved");
        }
    });       

  });    
 }
2
дададзена

Падзел працы і адпаведны код з нашага праекта:

//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);
    });
1
дададзена

Вось як спосаб захавання дадзеных з insertMany і захаваць

1) Mongoose захаваць масіў дакументаў з кодам <> 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) Mongoose save array of documents with .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});
        })
    })
})
1
дададзена