在MongoDB中用mongoose批量插入多个集合

我有2个集合( data ,元data

data模式是

 { _id: ......, name: ......, //not unique mobile: ......, // unique or null email: ......, // unique or null uniqueId: ......, // unique or null } 

插入需要至less一个唯一的数据

metaData模式是

 { _id: ......, dataId: ......,//refrence from _id of data collection key: ......, value: ...... } 

JSON数组正在从客户端获得

 [{ name: "abc", mobile: 9999999999, mData: { c1: 123, c2: "xyz" } }, { name: "qwerty", email: 'qwerty@mail.com', mData: { c1: 123, c2: "zxc" } } ...... ] 

我遍历数组,并将它们中的每一个都插入到MongoDB中。

 let Bulk = Data.collection.initializeUnorderedBulkOp(); dataArr.forEach(function(item) { let data = service.generateData(item); // data.query: {mobile: ..., email: ..., uniqueId: ...} // if value exists then keys is also exists for mobile, email, uniqueId in query Bulk.find(data.query).upsert().updateOne(data.doc); }); Bulk.execute((e, d) => { let metaBulk = MetaData.collection.initializeOrderedBulkOp(); let length = dataArr.length; dataArr.forEach(function(data) { Data.findOne(data.query).exec(function(err, data) { length--; for(let key in data["mData"]) { let value = data["mData"][key] || ""; let mData = service.generateMdata(key, value, data._id); metaBulk.find(mData.query).upsert().updateOne(mData.doc); } if(length == 0) { metaBulk.execute(); } }); }); }); 

我的解决scheme现在工作正常,但它需要太多的时间来迭代data收集find元data收集ID。

我需要一种将数据批量插入到MongoDB而不查找数据ID的方法。 是否有任何选项可以在单个查询中对多个集合使用mongoose进行批量插入。

在您的scheme的单个命令中没有多个集合更新。 在你的情况下,如果你可以在父集合中包含元数据数组,它可以用updateMany()单个命令插入数据。 MongoDB也支持通过db.collection.insertMany()进行批量插入。

 db.data.insertMany( [{ name: "abc",mobile: 9999999999, mData: { c1: 123, c2: "xyz"} }, {name: "qwerty",email: 'qwerty@mail.com',mData: { c1: 123, c2: "zxc" }}]); 

你也可以使用db.collection.bulkWrite() 。

我认为你可以做的是:

 async.each(jsonArray, function(jsonData,callback){ //first insert data in data schema var data = new data(jsonData); data.save(function(err){ if err throw err; //then you save the data in metaData collection async.each(jsonData.mData, function(metadata, callback2){ var metaDataObj = new metaData(metadata); metaDataObj.dataId = data._id; metaDataObj.save(function(err){ callback2(); }); }, function(err, results1){ callback(); }); }); }, function(err, results){ console.log('Data is saved'); });