如何使主键/ _id可选输入mongoose

时间:2016-09-01 04:04:14

标签: angularjs node.js mongodb mongoose

我想让主键无需输入,但主键自动生成在mongodb中。 所以,我使用{type:ObjectId,required:false},但它不会工作,因为我让主键为空。那么还有另一种方法可以使pprimary键可选输入吗?三江源

休息api模型

var mongoose = require("mongoose");
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId

var accessmenu = new Schema({
   _id : {type : ObjectId,required: false},
   acc_id : String,
   name : String,
   read : Boolean,
   execute : Boolean
},{ collection: 'access_menu'});

var accessmenu = mongoose.model("accessmenu",accessmenu);
module.exports.accessmenu = accessmenu;

休息api

app.put("/access_menu/:id",function(req,res){
    var AccessMenu = new accessmenu({
        _id : req.body._id,
        acc_id : req.body.acc_id,
        name : req.body.name,
        read : req.body.read,
        execute : req.body.execute
    });
    AccessMenu.save(function(err){
        if(err)
        {
            accessmenu.update({_id : req.params.id},{$set:{acc_id : req.body.acc_id,
                name : req.body.name,
                read : req.body.read,
                execute : req.body.execute
                }},function(err,users){
                if(err)
                {
                    data['error'] = 1;
                    data['Access_Menu'] = "update faill";
                    res.json(data);
                }
                else
                {
                    data['error'] = 0;
                    data['Access_Menu'] = "update success";
                    res.json(data);
                }
            });
        }
        else
        {
            data['error'] = 0;
            data['Access_Menu'] = "input success";
            res.json(data);
        }
    });
}); 

的script.js

if($scope.data_acc_lv.length > 0)
    {
        for(var i = 0;i<$scope.data_acc_lv.length;i++)
        {
            var input3 = {
                "_id" : $scope.data_acc_lv[i]._id,
                "acc_id":$scope.accLvID,
                "name": $scope.data_acc_lv[i].name,
                "read": $scope.data_acc_lv[i].read,
                "execute": $scope.data_acc_lv[i].execute
            }
            $http.put("http://localhost:22345/access_menu/" + $scope.data_acc_lv[i]._id,input3)
            .success(function(res,err){
                if(res.error == 0)
                {
                    $scope.data_acc_lv.length = 0;
                }
                else
                {
                    console.log(err);
                }

            }); 
        } 
    }

1 个答案:

答案 0 :(得分:2)

  

默认情况下,如果未将一个模式传递给模式构造函数,则Mongoose会为每个模式分配一个_id字段。分配的类型是ObjectId,以与MongoDB的默认行为一致。

如果您根本不想在子模式中添加_id,可以使用此选项将其禁用。

// disabled _id
var childSchema = new Schema({ name: String }, { _id: false });
var parentSchema = new Schema({ children: [childSchema] });

您只能在子文档上使用此选项。 Mongoose无法在不知道其ID的情况下保存文档,因此如果您尝试在没有_id的情况下保存文档,则会出现错误。

http://mongoosejs.com/docs/guide.html