2017-06-03 110 views
1

我有一个名为ReferralHistory的模式。 它包含一组用户和引用用户数组。使用Mongoose从文档中删除数组元素

ReferralHistory

var mongoose = require('mongoose'); 
var refferalHistorySchema = new mongoose.Schema({ 
    user: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User', 
     unique: true 
    }, 

    referrals: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
    }], 
}); 
var ReferralHistoryModel = mongoose.model('ReferralHistory', refferalHistorySchema); 
module.exports = { 
    referralHistory: ReferralHistoryModel 
} 

我需要删除推介数组中的特定用户集合中ReferralHistory [这里我只知道,称为用户ID]。如何我可以做到这一点?

编辑

收集 enter image description here

我试图

db.referralhistories.update({ "u_referrals": "593281ef966d7f0eeb94db3d" }, { "$pull": { "u_referrals": "593281ef966d7f0eeb94db3d" } }); 

O/Penter image description here

但文件没有更新。

回答

1

您使用$pull运算符与.update()。因此,假设referredId的价值你知道

ReferralHistoryModel.update(
    { "referrals": referredId }, 
    { "$pull": { "referrals": referredId } }, 
    { "multi": true }, 
    function(err,status) { 

    } 
) 

注意到{ "multi": true }装置中的更新可以在收藏被应用到多个匹配的文档。如果你真的只打算匹配和更新一个文档,那么你不包括该选项,因为只更新第一个匹配是默认的。

如果您想更具体,也有“用户”相匹配,那么你可以做:

ReferralHistoryModel.update(
    { "user": userId, "referrals": referredId }, 
    { "$pull": { "referrals": referredId } }, 
    { "multi": true }, 
    function(err,status) { 

    } 
) 

然后比赛需要两个值是存在,而不是任何ReferralhistoryModel与您提供的referredId匹配的文件。

+0

感谢您的回答。我尝试了您的解决方案。但没有得到结果。更新了 – Muhsin

+0

@Muhsin的问题,因为您正在shell/robomongo /无论如何输入。值是'ObjectId'而不是字符串。在shell中,您需要使用ObjectId(“593281ef966d7f0eeb94db3d”)'来匹配。然而,猫鼬会为你投下这种类型。 –

+0

它现在工作了。非常感谢您的帮助。这对我非常有帮助。 – Muhsin