繁体   English   中英

如何在 collections 之间移动 mongodb 中的文档

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM