2016-11-14 103 views
2

我試圖使用貓鼬從文檔中的數組中刪除對象。如何從使用貓鼬的陣列中刪除對象

的架構如下:

var diveSchema = new Schema({ 
//irrelevant fields 
    divers: [{ 
     user: { type: Schema.Types.ObjectId, ref: 'User', required: true }, 
     meetingLocation: { type: String, enum: ['carpool', 'onSite'], required: true }, 
     dives: Number, 
     exercise: { type: Schema.Types.ObjectId, ref: 'Exercise' }, 
    }] 
}); 

一個可能的入口可以

{ 
    //irrelevant fields 
    "divers": [ 
     { 
      "_id": "", 
      "user": "123456789", 
      "meetingLocation": "carpool", 
      "exercise": "34567890", 
     }, 
     { 
      "_id": "", 
      "user": "123456780", 
      "meetingLocation": "onSite", 
      "exercise": "34567890", 
     } 
    ] 
} 

說我想刪除的條目,其中user123456789(請注意,我不知道_id在這點)。

如何正確執行此操作?

我試過如下:

 var diveId = "myDiveId"; 
     var userIdToRemove = "123456789" 
     Dive.findOne({ _id: diveId }).then(function(dive) { 
      dive.divers.pull({ user: userIdToRemove }); 
      dive.save().then(function(dive) { 
       //do something smart 
      }); 
     }); 

這yieled文檔中沒有變化。

我也試過

Dive.update({ _id: diveId }, { "$pull": { "divers": { "diver._id": new ObjectId(userIdToRemove) } } }, { safe: true }, function(err, obj) { 
    //do something smart 
}); 

有了這個,我得到的結果是整個divers陣列被掏空對於給定的潛水。

回答

5

這是怎麼回事?

Dive.update({ _id: diveId }, { "$pull": { "divers": { "user": userIdToRemove } }}, { safe: true, multi:true }, function(err, obj) { 
    //do something smart 
}); 
+0

這似乎工作!謝謝,但是你也可以解釋我做錯了什麼,因爲我以前只嘗試過使用'user',但是我沒有添加'multi'部分 – Sonaryr

+0

這個選項如何{safe:true,multi:true} '當你有一個更新操作查詢單個文檔'{_id:diveId}'時會有幫助嗎? – chridam

+0

@chridam,你是對的,對於單個文檔和$拉它是使用multi:true的矯枉過正,但說實話,我遇到了一些只要一次操作就停止執行的驅動程序(不是文檔)如果你沒有提供多爲真的。例如,如果您在數組中調用$ set,則驅動程序僅爲某個驅動程序設置數組的第一個元素。這就是我使用它的原因。你可以避免它。 –

0

試試這個

Dive.update({_id:diveId},{ 「$拉」:{ 「驅動程序」:{ 「用戶」: 「123456789」}}})

+0

這沒有奏效。 – Sonaryr