javascript - 如何使用 mongoose 和 nodeJS 在 MongoDB 集合中复制或克隆文档
问题描述
我们如何将文档克隆到具有新 _id 的相同或新集合中
这是来自“doc”(res.query)的查询中找到的数据
[
{
_id: new ObjectId("614d4766fb2600340fdb2904"),
templateName: 'first template',
_ref: '1632454502ref',
owner: 'wxTWH8zqSwaIXPAVsjZoRCkvjx73',
__v: 0
}
]
不工作:
TemplateInfo.find(req.query).exec(function (err, doc) {
console.log("document", doc);
var newdoc = new TemplateInfo(doc[0]);
delete newdoc._id; //= mongoose.Types.ObjectId();
newdoc.save();
});
这可行,但数据现在是一个未正确插入的对象
TemplateInfo.find(req.query).exec(function (err, doc) {
console.log("document", doc);
var newdoc = new TemplateInfo(doc);
newdoc._id = mongoose.Types.ObjectId();
newdoc.save();
});
结果但错误:
{
"0": {
"_id": {
"$oid": "614d4766fb2600340fdb2904"
},
"templateName": "first template",
"_ref": "1632454502ref",
"owner": "wxTWH8zqSwaIXPAVsjZoRCkvjx73",
"__v": 0
},
"_id": {
"$oid": "614e34dbf288909e4713282b"
},
"__v": 0
}
工作正常但是我需要从未手动输入的查询中获取我的数据
const docData = {
//_id: new ObjectId("614d4766fb2600340fdb2904"),
templateName: "first template",
_ref: "1632454502ref",
owner: "wxTWH8zqSwaIXPAVsjZoRCkvjx73",
__v: 0,
};
TemplateInfo.find(req.query).exec(function (err, doc) {
console.log("document", doc);
var newdoc = new TemplateInfo(docData);
newdoc._id = mongoose.Types.ObjectId();
newdoc.save();
});
结果正确,但我手动将它们作为变量输入:
{
"_id": {
"$oid": "614e378700b5bd9c7ba5ef37"
},
"templateName": "first template",
"_ref": "1632454502ref",
"owner": "wxTWH8zqSwaIXPAVsjZoRCkvjx73",
"__v": 0
}
我希望在 mongoDB 集合中有一个具有不同 _id 的文档的副本
{
_id: new ObjectId("614d4766fb2600340fdb2904"),
templateName: 'first template',
_ref: '1632454502ref',
owner: 'wxTWH8zqSwaIXPAVsjZoRCkvjx73',
__v: 0
}
解决方案
以下是在 mongoose 中复制/克隆文档的示例。
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/test');
const Cat = mongoose.model('Cat', { name: String });
Cat.find({_id:'614e440b771169c71a34dae9'}).exec(function (err, doc) {
console.log("document", doc);
doc.forEach(node => insertBatch(node));
});
function insertBatch( doc) {
var id;
id = mongoose.Types.ObjectId();
doc._id = id;
console.log("doc", doc);
const kitty = mongoose.model('Cat');
kitty.findOneAndUpdate({_id: id}, doc, {upsert: true}, function(err, doc1) {
if (err) return res.send(500, {error: err});
console.log('Succesfully saved.');
});
}
"614e440b771169c71a34dae9" 可以是集合中的任何 id
推荐阅读
- sql - where 子句和计数事务有问题吗?
- java - Tomcat 9.027:端口超出范围
- dictionary - 在不搜索的情况下在谷歌地图中显示我的商店
- java - XSharedPreferences 总是在我的 xposed 模块中获得默认值
- html - 更改截面高度
- bigcartel - 使用 SnakeBite 主题删除 Big Cartel 上的页面
- java - 如何删除 JButton 内文本周围的框?
- python-3.x - python请求登录或填写表格
- c++ - 我得到一个没有被忽略的空值,因为它应该是错误的,为什么?
- scala - Scala:从“任何”值的集合中检测并提取更具体的东西