2013-01-16 72 views
0

我正在第一次使用Mongoose,並試圖完成似乎是一項簡單的任務。我有一個包含clients屬性的用戶文檔,其中包含一組客戶端ID。舉例來說,我的文檔如下所示:從Mongoose中嵌套數組中提取值

{ 
    email: "[email protected]", 
    password: "$2a$10$xZVzMYgyoyT.biOMDrBlRe3HNHY5A6lXga6uc8b/cnIAX/khQ7ep2", 
    modified: ISODate("2013-01-16T00:13:56.894Z"), 
    created: ISODate("2013-01-16T00:13:56.894Z"), 
    _id: ObjectId("50f5f0c4d6bbbcc6ce000002"), 
    clients: [ 
    "50f6e118e0ccf9a1e9000001", 
    "50f6e12be0ccf9a1e9000002" 
    ], 
    __v: 0 
} 

我創建了一箇中間件,用於在調用remove()時刪除客戶端的依賴關係。

clientSchema.pre('remove', function(next) { 

    Sweepstakes.remove({client_id: this._id}).exec(); 
    Submission.remove({client_id: this._id}).exec(); 

    // find users with this._id present in clients, and remove from array 

    next(); 

}); 

現在,我只需要找出誰擁有當前客戶端ID在clients所有用戶,刪除ID,並更新用戶。

我知道我可以很容易地查詢所有帶有id的用戶,然後循環並單獨保存每個用戶......但這似乎效率低下,我的直覺告訴我有更好的方法來完成我正在試圖做的 - 只是在文檔中找到它很難。

使用貓鼬做這件事最有效的方法是什麼?

+1

您是否知道文檔中的[this handy operator reference](http://docs.mongodb.org/manual/reference/operators/)? – JohnnyHK

+0

@JohnnyHK我現在做!感謝您發送我的方式。 –

回答

2

大概是這樣的:

Users.update({condition}, {$pull : { clients: this._id} }, function(err, numAffected) { 
    //handle errors and whatever 
    next(); 
}); 

您可以添加clients : {$in : [this._id]}condition限制更新。

+0

我給了一個鏡頭,並沒有拋出任何錯誤。回到0行受到影響,並且該id不會從'clients'數組中移除。我仔細檢查了JohhnyHK上面提供的文檔,看起來好像我的條件設置正確。任何機會,你可以看看我修改過的代碼,看看有什麼/如果我錯過了什麼? [GIST](https://gist.github.com/4549233) –

+0

@NickParsons對我來說看起來很好。如果分支儘管如此,我會建議在單個語句周圍放置保護性括號, – soulcheck

+0

我縮小了範圍。看起來'clients'數組中的id必須是ObjectId類型。我手動將它們作爲字符串放入我的'clients'數組中。我的模式或創建函數有一些不允許將它們作爲ObjectId轉換。調試開始。 –