2016-04-27 62 views
1

我有一個主管架構,如果用戶想要修復約會,他的輸入是在DB中進行的。模式是:無法將數據插入到集合中

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

的AppointmentList是JSON對象的數組,它包含與約會具有該人員的ID來進行,日期和用戶ID(其想要固定預約的用戶)。

但是爲了避免重複的約會條目,我一直在使用互聯網上提到的幾種方法。到目前爲止,他們都沒有爲我工作。我張貼下面的代碼。下面的代碼的問題是它永遠不會在約會列表中插入任何數據。但是,如果我使用保存()而不是更新()插入發生但重複也插入。

這裏是JSON對象,我想從DB陣列中添加,

{ 
    "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"); 
       } 
      }); 
    } 
}); 

回答

0

使用$addToSet運營商可能爲你工作。

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

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

但它不是一個完美的解決方案,因爲{之一:1,二:2}和{二:2,一:1}不會被解釋爲相等,因此他們可能都被添加到一個數組$ addToSet。

要完全避免重複,你可以做這樣的事情:

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

+0

有幾個問題: 'appointmentList.id'可以告訴貓鼬那看起來進入表/集合字段稱爲appointmentList,然後遍歷所有JsonObjects約會列表字段具有匹配他們提供的ID,對吧?如果是這樣,這意味着如果我們有像appointmentList = [{a:1,[{b:7}]},...],我們可以通過appointmentList.a.b來檢查「b」如果不是,我們怎樣才能訪問b?有沒有教這個教導呢? – user2498079

相關問題