我試圖使用貓鼬從文檔中的數組中刪除對象。如何從使用貓鼬的陣列中刪除對象
的架構如下:
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",
}
]
}
說我想刪除的條目,其中user
是123456789
(請注意,我不知道_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
陣列被掏空對於給定的潛水。
這似乎工作!謝謝,但是你也可以解釋我做錯了什麼,因爲我以前只嘗試過使用'user',但是我沒有添加'multi'部分 – Sonaryr
這個選項如何{safe:true,multi:true} '當你有一個更新操作查詢單個文檔'{_id:diveId}'時會有幫助嗎? – chridam
@chridam,你是對的,對於單個文檔和$拉它是使用multi:true的矯枉過正,但說實話,我遇到了一些只要一次操作就停止執行的驅動程序(不是文檔)如果你沒有提供多爲真的。例如,如果您在數組中調用$ set,則驅動程序僅爲某個驅動程序設置數組的第一個元素。這就是我使用它的原因。你可以避免它。 –