我有两个集合(
至少需要一个唯一数据以进行插入。
“metaData”模式是:
从客户端获取了一个
我正在遍历数组,并将它们分别插入到MongoDB的两个集合中。
我的解决方案现在运行良好,但是迭代“data”集合以查找“metaData”集合的ID需要太多时间。
我需要一种批量将数据插入MongoDB而无需查找数据ID的方法。是否有使用mongoose在单个查询中执行多个集合的批量更新选项?
data
,metaData
)。
data
的模式如下:{
_id: ......,
name: ......, //not unique
mobile: ......, // unique or null
email: ......, // unique or null
uniqueId: ......, // unique or null
}
至少需要一个唯一数据以进行插入。
“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();
}
});
});
});
我的解决方案现在运行良好,但是迭代“data”集合以查找“metaData”集合的ID需要太多时间。
我需要一种批量将数据插入MongoDB而无需查找数据ID的方法。是否有使用mongoose在单个查询中执行多个集合的批量更新选项?
.find()
视为"唯一"。因此,你的查询条件已经确定了一个"唯一键"。你整个问题的关键在于找到被"upserted"的_id
值。你可以通过使用"已经唯一"的数据作为该值来解决这个问题,而不是等待驱动程序分配它。这是一个非常简单的概念。 - Neil Lunn