来自ObjectID数组的MongoDB $ pull值

时间:2014-02-04 20:46:05

标签: mongodb mongoose

我的藏品中有这个文件:

{
    "_id" : ObjectId("52718433e18a711923000005"),
    "owners" : [
        ObjectId("52718433e18a711923000004"),
        ObjectId("52ed40dccc5bc50000000003"),
        ObjectId("52ed4171abe2780000000003")
    ]
}

我有以下声明,我试图删除owners字段中的一个值:

Business.update({_id:req.body._id}, {$pull:{"owners":req.body.userid}}, function(err){
    if(err){
        res.json(500, {message:"Could not remove user from admin list"});
    }else{
        res.json(200);
    }
});

我知道req.body._idreq.body.userid具有有效值:

{ _id: '52718433e18a711923000005',
  userid: '52ed4171abe2780000000003' }

其他操作(例如按ID等查找业务)起作用,因此它不是ObjectId格式问题。还有什么呢?

- 编辑:这是我的(缩写)架构定义:

var BusinessSchema = new Schema({
    business_name: {type: String, required: true},
    owners: {type: Array}
});

2 个答案:

答案 0 :(得分:1)

在尝试匹配要拉取的值时,看起来需要转换为ObjectId。但不要搜索。所以这有效:

var ObjectId = require('mongoose').Types.ObjectId;

Business.update({_id:req.body._id}, {$pull:{"owners": new ObjectId(req.body.userid)}}, function(err){
    if(err){
        res.json(500, {message:"Could not remove user from admin list"});
    }else{
        res.json(200);
    }
});

- 编辑:因此,如果我将架构从owners: {type: Array}更改为owners: [Schema.Types.ObjectId],我可以跳过转换,并且我的原始语句有效。

答案 1 :(得分:1)

您当前的架构没有向Mongoose提供有关owners数组字段中包含的数据类型的任何指示。如果您希望Mongoose将您的字符串强制转换为ObjectID,则需要在模式中提供类型信息:

var BusinessSchema = new Schema({
    business_name: {type: String, required: true},
    owners: [{type: Schema.ObjectId}]
});