2014-10-08 55 views
6

我对用户来说,这一点架构:猫鼬 - 删除子文件阵列项目

{ 
username: String, 
contacts: Array 
} 

因此,例如,一些用户的联系人会是这样的:

{ 
username: "user", 
contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}] 
} 

现在我需要删除项目从联系人,所以我这样做:

model.findByIdAndUpdate(23, {'$pull': { 
       'contacts':{'id':'525.....etc'} 
       }}); 

但似乎不工作,n O错误,但它不被删除,我只是想这个文档返回给用户:

{ 
    username: "user", 
    contacts: [{'id':ObjectId('534.....etc'), 'approved': false}] 
    } 

如何实现这一目标?

回答

10

$pull操作者实际上只是执行在其上操作所述阵列元件上的条件。看起来你的问题可能并没有真正表明你正在使用默认情况下为所有数组字段创建的ObjectId值。

所以,你可以给你这样的查询,进口ObjectId创建方法:

model.findByIdAndUpdate(23, { 
    '$pull': { 
     'contacts':{ '_id': new ObjectId(someStringValue) } 
    } 
}); 

或者其实你实际上可以定义你的“模式”更好一点,和猫鼬实际上将“自动施放的”根据架构中定义的“类型”的ObjectId为您提供:

var contactSchema = new Schema({ 
    approved: Boolean 
}); 

var userSchema = new Schema({ 
    username: String, 
    contacts: [contactSchema] 
}); 

这让猫鼬为“遵守规则”的严格定义字段定义。所以现在知道,你实际上有触点阵列的每个元素_id场,和那场“类型”实际上是一个ObjectId所以它会自动重新投“字符串”作为一个真正的ObjectId提供的值。

+0

喜感谢,但现在我得到这个错误:** [MongoError:例外:不能使用的部分(contacts.id的触点)横贯元件({联系人:[{ID:物件( '543394bb964ac60915ceba8b' ),批准:false},{id:ObjectId('543399f9964ac60915ceba8c'),approved:false}]})**这可能是什么?我用你的点注释 - – sbaaaang 2014-10-08 09:08:39

+0

@sbaaaang你究竟在做什么?你是否按照你的要求使用了“点符号”形式?顺便说一句,谢谢你清楚地表明你的实际数据与你发布的不同,这可能再次成为问题的一部分。请编辑以显示您的真实数据结构。 – 2014-10-08 09:20:45

+0

是使用*点符号*像你说的,是的即时通讯使用ObjectIds,但这不是我想的问题:P不准? (编辑问题) – sbaaaang 2014-10-08 09:21:41

1

finaly!

MongoDB: 

"imgs" : {"other" : [ { 
     "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg", 
     "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg", 
     "_id" : ObjectId("58433bdcf75adf27cb1e8608") 
            } 
          ] 
        }, 
router.get('/obj/:id', function(req, res) { 
var id = req.params.id; 



Model.findOne({'imgs.other._id': id}, function (err, result) { 
     result.imgs.other.id(id).remove(); 
     result.save();    
    });