无法将数据插入集合中

时间:2016-04-27 18:35:41

标签: json node.js mongodb mongoose mean-stack

我有官员Schema,如果用户想要修改约会,他的输入是在DB中进行的。架构是:

officerSchema = mongoose.Schema({
    email : {type: String,
        index: { unique: true }
    },
    appointmentList : Array // array of jsonObject of dates and userID
});

AppointmentList是一个JSON对象数组,其中包含必须进行约会的人员的ID,日期和用户ID(想要修复约会的用户)。

然而,为了避免重复的约会条目,我一直在使用互联网上提到的几种方法。到目前为止,他们都没有为我工作过。我发布下面的代码。以下代码的问题是它永远不会在appointmentmentsList中插入任何数据。但是,如果我使用 save()而不是更新()插入,但也会插入重复项。

以下是我想在DB数组中添加的JSON对象,

{
    "id": "1321231231",
    "appointment": {
        "userID": "31321",
        "date": "24 March"
    }
}

var ID = requestObject.id; 
var newObject =  {$addToSet: requestObject.appointment};
OfficerModel.findOne({_id : ID}, function(err, foundData) {
    if(err) {
        console.log(err);
        return;
    }
    else {
            var dbList = foundData.list;
            dbList.push(newObject);
            foundData.update(function(err, updatedData) {
                if(err) {
                    console.log( err);
                }
                else {
                    console.log("successful");
                }
            });
    }
});

1 个答案:

答案 0 :(得分:0)

使用$addToSet运算符可能适合您。

var appt = {
  id: "1321231231",
  appointment: {
    userID: "31321",
    date: "24 March"
  }
}

Officer.update(
  {_id: ID}, 
  {$addToSet: {appointmentList: appt}},
  function(err) { ... }
);

但它不是一个完美的解决方案,因为{one:1,2,2:}和{two:2,one:1}不会被解释为相等,所以它们都可以添加到带有$ addToSet的数组中。 / p>

为了完全避免重复,你可以这样做:

var appt = {
  id: "1321231231",
  appointment: {
    userID: "31321",
    date: "24 March"
  }
};

Officer.findOne(
  {_id: ID, 'appointmentList.id': appt.id}, 
  function(err, officerDoc) {
    if (err) { ... }

    // since no document matched your query, add the appointment
    if (!officerDoc) {
      Officer.update(
        {_id: ID}, 
        {$push: {appointmentList: appt}}, 
        function(err) { ... }
      );
    }

    // since that appointment already exists, update it
    else {
      Officer.update(
        {_id: ID, 'appointmentList.id': appt.id},
        {$set: {'appointmentList.$.appointment': appt.appointment}},
        function(err) { ... }
      );
    }
  }
);

更新现有约会的上述操作使用positional operator