[英]How to move documents in mongodb between collections
如何将一个现有文档从一个集合移动到另一个集合?
基本上,我所拥有的是一个客户模式:
const customerSchema = new mongoose.Schema ({
firstname: String,
lastname: String,
email: String,
});
和它的 Model:
const Customer = new mongoose.model('Customer', customerSchema);
现在我想将一个文档移动到存档集合中。 所以我想,我创建一个新的 model,如下所示:
const CustomerArchive = new mongoose.model('CustomerArchive', customerSchema);
然后,当有人单击带有 formaction: "/archive-data" 的按钮时,需要将数据集从 Customer 集合移动到 CustomerArchive 集合。
[
{
_id: new ObjectId("6325ba96f228119e479963ca"),
firstname: 'Testuser',
lastname: 'Testuser',
email: 'test@user',
__v: 0
}
有没有办法将一个文档移动到另一个集合而无需再次定义每个属性?
app.post("/archive-data", (req, res) => {
const docId = req.body.archiveButton;
Customer.find({ _id: docId }, (err, document) => {
CustomerArchive.create([document])
})
})
这是我到目前为止所拥有的,它确实有效,但必须有更好的方法 - 即使涉及唯一 ID 或重复项:
app.post("/archive-data", (req, res) => {
const docId = req.body.archiveButton;
Customer.find({ _id: docId}, (err, document) => {
CustomerArchive.create({
_id: document[0]._id,
firstname: document[0].firstname,
lastname: document[0].lastname,
email: document[0].email
});
Customer.findByIdAndRemove(docId, (err) => {
if (!err) {
res.redirect("/customers");
} else {
console.log(err);
}
});
})
});
而且,另一个问题:有谁知道 mongodb 中的 ID 在 collections 中是否唯一? 就像在这种情况下:我将文档从集合客户移动到存档集合,但是,如果有人决定将存档文档移回生产集合 - id 已经存在的可能性可能非常低,但在巨大的客户数据库它可能会发生
您可以像这样简单地编写一个简短的聚合管道:
app.post("/archive-data", async (req, res) => {
const docId = req.body.archiveButton;
await Customer.aggregate([
{ $match:
{ _id: docId}
},
{
$merge: {
into: "customerArchive",
on: "_id",
whenMatched: "replace",
whenNotMatched: "insert"
}
}
]).exec((err, res) => console.log(`${err} ${res}`));
Customer.findByIdAndRemove(docId, (err) => {
if (!err) {
res.redirect("/customers");
} else {
console.log(err);
}
});
});
在管道中,我们首先匹配所需的文档并使用$merge将其合并到customerArchive
集合中。
如果您按照 Mongodb 的建议使用ObjectId
,您可以确定它在 collections 中是唯一的,因为它是时间戳、随机数和自动递增计数器的组合,因此发生冲突的可能性极小.
此外,创建一个新集合来存储仅存档客户,似乎有点过头了,您可以减少很多工作,只需将 boolean 值archive
存储在客户的 collections 本身中,表示客户是否已存档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.