【问题标题】:NodeJS, Mongoose - Duplicate entries when inserting dataNodeJS,Mongoose - 插入数据时重复条目
【发布时间】:2014-10-06 04:55:02
【问题描述】:

我有带有 Mongoose 的 NodeJS,我正在访问一个 API 来检索数据。我有一个架构如下。

var dataSchema = new Schema({
  id:Number,
  name:String
));

我正在使用以下代码插入。

  var d = Data.find({id:data.id}, function(error, curr_data) {
    if(curr_data.length == 0) { // check to make sure only unique entries are entered
      console.log("      Inserting : " + curr_data.name);
      new Data(data).save();
    }
  });

但是当我检查我的 Mongo DB 时,我仍然可以看到重复的条目。

还有其他方法吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可以使用 Mongo 的内置 count() method 来检查该行是否存在并从中有条件地保存模型:

    Data.count({id: data.id}, function (err, count) {
      if (!count) {
        console.log("Inserting " + curr_data.name);
        new Data(data).save();
      }
      else {
        // Handle err.
        console.log('Already Exists');
      }
    });
    

    【讨论】:

    • 您也可以使用与 .findOne 完全相同的东西,这有点不那么令人难忘,但确实为您提供了完整的返回 db 行,如果它是重复的,您可以访问其属性。
    【解决方案2】:

    您不需要向架构中添加 id,Mongoose 会为您创建一个 ObjectId。

    “如果没有将一个 _id 字段传递到 Schema 构造函数中,Mongoose 默认为您的每个架构分配一个 _id 字段。分配的类型是一个 ObjectId 以符合 MongoDB 的默认行为。如果您不希望将 _id 添加到您的架构中完全可以使用此选项禁用它。” - 来自Mongoose docs

    如果您确实想指定自己的 id,您可以执行以下操作以确保不会创建重复项:

    var dataSchema = new Schema({
      id: {
        type: Number,
        index: {
          unique: true
        }
      },
      name: String
    },
    { _id: false });
    

    【讨论】:

    • [错误:文档必须有_id才能保存]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多