当前位置 : 主页 > 网页制作 > Nodejs >

node.js – 在MongoDB中使用mongoose批量插入多个集合

来源:互联网 收集:自由互联 发布时间:2021-06-16
我有2个集合(data,metaData) 数据模式是 {_id: ......,name: ......, //not uniquemobile: ......, // unique or nullemail: ......, // unique or nulluniqueId: ......, // unique or null} 插入需要至少一个唯一数据 元数据架构是
我有2个集合(data,metaData)

数据模式是

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

插入需要至少一个唯一数据

元数据架构是

{
_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();
      }
    });
  });
});

我的解决方案现在工作正常但是它花了很多时间来迭代数据收集以查找metaData集合的ID.

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

您的方案的单个命令中没有多个集合更新.在您的情况下,如果您可以在父集合中包含元数据数组,则可以使用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().

网友评论