我在集合中有一堆文件需要复制并插入到集合中,只更改所有这些上的parent_id。这需要非常长的时间并且最大化我的CPU。这是我目前的实施。我只需要更改所有文档的parent_id。
// find all the documents that need to be copied
models.States.find({parent_id: id, id: { $in: progress} }).exec(function (err, states) {
if (err) {
console.log(err);
throw err;
}
var insert_arr = [];
// copy every document into an array
for (var i = 0; i < states.length; i++) {
// copy with the new id
insert_arr.push({
parent_id: new_parent_id,
id: states[i].id,
// data is a pretty big object
data: states[i].data,
})
}
// batch insert
models.States.create(insert_arr, function (err) {
if (err) {
console.log(err);
throw err;
}
});
});
这是我正在使用的架构
var states_schema = new Schema({
id : { type: Number, required: true },
parent_id : { type: Number, required: true },
data : { type: Schema.Types.Mixed, required: true }
});
必须有更好的方法来做到这一点,我似乎无法想出。任何建议都非常欢迎!感谢。
答案 0 :(得分:0)
在这种情况下,在应用层上没有必要这样做。只需在数据库中执行此操作
db.States.find({parent_id: id, id: { $in: progress} }).forEach(function(doc){
delete doc._id;
doc.parentId = 'newParentID';
db.States.insert(doc);
})
如果你真的需要在mongoose中这样做,我会看到以下问题: 您返回符合条件的所有文档,然后迭代它们并将它们复制到另一个数组(修改它们),然后迭代修改后的元素并将它们复制回来。所以这至少比我正在做的事情长3倍。
P.S。如果您需要保存到其他收藏品,则应将db.States.insert(doc)
更改为db.anotherColl.insert(doc)
P.S.2 如果你不能从shell中执行此操作,我希望你能找到一种方法将我的查询插入到mongoose中。