【问题标题】:how to make primary key / _id optional to input in mongoose如何使主键/ _id 可选择在猫鼬中输入
【发布时间】:2017-01-08 19:22:37
【问题描述】:

我想让主键不需要输入,但主键会在 mongodb 中自动生成。 所以,我使用 {type : ObjectId,required:false},但它不起作用,因为我让主键为空。那么还有其他方法可以使 pprimary 键可选输入吗?谢谢你

rest 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;

休息接口

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);
                }

            }); 
        } 
    }

【问题讨论】:

  • 无需在架构中包含_id...它会在您保存记录时自动生成...更多信息请访问docs.mongodb.com/manual/reference/method/ObjectId
  • 但是如果我没有在 schema 中包含 _id,我在执行 http.delete 或 http.get 时还能得到 _id 吗? @sss
  • 是的..显然你会得到它
  • @sss 在我尝试了你所说的之后,它的工作。但它在更新后创建重复数据,它创建具有不同主键的相同数据。那我该怎么办?
  • 更新时不要使用_id作为条件......请参阅stackoverflow.com/a/7486950/5735460

标签: angularjs node.js mongodb mongoose


【解决方案1】:

默认情况下,如果未将一个 _id 字段传递给 Schema 构造函数,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

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 2021-01-29
    • 2021-04-18
    • 2017-12-06
    • 2022-01-23
    • 2013-06-19
    • 2016-11-12
    • 2021-08-11
    • 2016-11-06
    相关资源
    最近更新 更多