如何阻止数据库复制项目

时间:2019-11-29 20:17:21

标签: node.js mongodb mongoose

我正在学习Nodejs和MongoDB,并且我成功连接到数据库并保存到数据库正在工作,但是例如,如果我将另一个项目添加到列表中,然后再次运行脚本以将其保存到数据库,它将复制已经存在的项目存在。 我想在需要添加新项目时执行该项目,它只会添加该特定项目,而不是再次添加所有内容。

这是我的播种机:

const mongoose = require("mongoose");
const Keys = require("../config/auth");

mongoose.set("useUnifiedTopology", true);
mongoose.set("useNewUrlParser", true);
mongoose.connect(Keys.MongoURI);

const products = [
  new Product({
    imagePath:
      "test",
    title: "test1",
    description: "test1",
    price: 20
  }),
  new Product({
    imagePath:
      "test2",
    title: "test2",
    description: "test2",
    price: 20
  })
];

let done = 0;
for (let i = 0; i < products.length; i++) {
  products[i].save(function(err, result) {
    done++;
    if (done === products.length) {
      exit();
    }
  });
}
function exit() {
  mongoose.disconnect();
}
console.log(products);

因此,例如,如果我在此处添加新产品,则应该检查数据库是否类似:标题与数据库匹配,然后不添加至数据库,只有标题可用的那些。

谢谢!

2 个答案:

答案 0 :(得分:2)

要创建唯一索引,请使用db.collection.createIndex()方法,并且将unique选项设置为true。

例如,要在产品集合的标题字段上创建唯一索引,请在mongo shell中使用以下操作:

db.products.createIndex( { "title": 1 }, { unique: true } )

答案 1 :(得分:0)

您可以通过在集合中创建唯一索引来防止具有相同标题的多个产品。

knit("filename.Rmd")

当插入具有现有标题的文档时,这将生成yourProductSchema.index({ "title": 1 }, { unique: true });

更多信息:https://docs.mongodb.com/manual/core/index-unique/

另一种方式,如果您还希望更新其他字段。您可以使用upsert。此处更多信息:https://docs.mongodb.com/manual/reference/method/db.collection.update/