2013-03-25 47 views
3

我試圖從數組(子文檔)中拉/取值。NodeJS/Mongoose/MongoDB - 拉(從數組中)不起作用

實例文檔:

{ 
    _id: 5150a1199fac0e6910000002, 
    name: 'some name, 
    items: [{ 
     id: 23, 
     name: 'item name 23' 
    },{ 
     id: 24, 
     name: 'item name 24' 
    }] 
} 

我在內存中的文檔,因爲我從蒙戈把它了。我想:

var left = object.items.pull({id: 24}); 
console.log(left) 

輸出:

[{ 
    id: 23, 
    name: 'item name 23', 
    _id: 5150a1199fac0e6910000045 
},{ 
    id: 24, 
    name: 'item name 24', 
    _id: 5150a1199fac0e6910000002 
}] 

所以看起來像我已經有一個問題。從pull調用返回的數組應該是pull之後數組中剩餘的數組。不知道爲什麼它沒有從項目數組中拉出來。這是否僅支持通過ObjectId ant而不是用戶定義的字段?

我打電話保存:

object.save(); 

貓鼬將這一情況記錄查詢:

Mongoose: mycollection.update({ _id: ObjectId("5150901ac345824a07000002"), __v: 3 }) 
    { '$inc': { __v: 1 }, '$pull': 
    { attachments: { _id: { '$in': [ ObjectId("5150c64d63773efb1f000002") ] } } } } {} 

這說明了爲什麼我的文件沒有被刪除。應刪除的數組項的_id是:

_id: 5150a1199fac0e6910000002 

是貓鼬被髮送到數據庫中移除該項目是:

ObjectId("5150c64d63773efb1f000002") 

任何想法我做錯了嗎?我試圖刪除_id以外的東西,不知道這是否可能,但從文檔看起來是。

回答

11

我發現$ pull命令對我不起作用,除非我將回調包含在參數列表中。

在我的情況,這種格式沒有工作:

UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}); 

但這種格式做:

UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}, function(err, data){ 
    console.log(err, data); 
}); 

根據該文件,好像都應該工作,但是沒有。原因是第一種方式要求您在返回的對象上調用.exec(),而回調版本自動調用exec()。也給我造成了一些困惑。

所以,你需要做這樣的事情:

UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}).exec(); 
+0

即使我面臨着同樣的問題。有沒有什麼辦法可以對實例執行'pull'而不是'user.alerts.pull()'而不是'User.findOneAndUpdate()'模型? – Raeesaa 2014-04-28 06:11:01

+1

@ user2235057這不會很有伸縮性。如果多個同一個電話同時被觸發,您可能會碰撞實例。 – FRD 2014-08-21 14:23:51