Node.js 当mongoose模型是新的';预计起飞时间?

Node.js 当mongoose模型是新的';预计起飞时间?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,有没有一种方法可以在mongoose中声明一个模型模式,这样当模型是新的时,_id字段就会自动生成 例如: var mongoose = require('mongoose'); var Schema = mongoose.Schema; var ObjectIdSchema = Schema.ObjectId; var ObjectId = mongoose.Types.ObjectId; var PersonSchema = new Schema({ _id:

有没有一种方法可以在mongoose中声明一个模型模式,这样当模型是新的时,_id字段就会自动生成

例如:

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

var PersonSchema = new Schema({
    _id:            ObjectIdSchema,
    firstName:      {type: String, default: 'N/A'},
    lastName:       {type: String, default: 'N/A'},
    age:            {type: Number, min: 1}
});

var Person = mongoose.model('Person', PersonSchema);
一开始,我觉得很棒!,我就这么办

_id:    {type:ObjectIdSchema, default: new ObjectId()}
但这当然不起作用,因为new ObjectId()只在模式初始化时被调用。因此,两次调用new person()将创建两个具有相同_id值的对象

那么,有没有一种方法可以让我每次执行“newperson()”时都会生成一个新的ObjectId()

我之所以尝试这样做,是因为我需要知道新人的_id值,以便进一步处理

我还尝试:

var person = new Person({firstName: "Joe", lastName: "Baz"});
person.save(function(err, doc, num){
    console.log(doc._id);
});
即使这样,doc也不包含ObjectId。但如果我查看数据库,它确实包含它

p、 我用的是猫鼬2.7.1

p、 另外,我知道我可以在创建人员时手动创建ObjectId:

var person = new Person({_id: new ObjectId(), firstName: "Joe", lastName: "Baz"});

但我宁愿不必导入ObjectId,每次我想新一个人时都要重新创建它。我想我已经习惯于使用mongodb的java驱动程序,在这里我可以在模型构造函数中为_id字段创建值。

调用var person=new person()的那一刻; person.\u id应该给你这个id(即使它还没有被保存)。仅实例化它就足够给它一个id了。之后您仍然可以保存它,这将存储id以及person对象的其余部分,而不是:

_id:    {type:ObjectIdSchema, default: new ObjectId()}
你应该做:

_id:    {type:ObjectIdSchema, default: function () { return new ObjectId()} }

添加
auto
标志:

_id: {
    type: mongoose.Schema.Types.ObjectId,
    index: true,
    required: true,
    auto: true,
  }

摘自官方MongoDB手册和文档:

_身份证 每个MongoDB文档中都需要一个字段。
\u id
字段必须具有 独特的价值。您可以将
\u id
字段视为文档的主字段 钥匙如果您创建的新文档没有
\u id
字段,则MongoDB 自动创建字段并指定唯一的BSON ObjectId。


目标 objectid很小,很可能是唯一的,生成速度很快,而且是有序的。 ObjectId值由12个字节组成,其中前四个字节是 反映ObjectId创建的时间戳。具体而言:

表示自Unix纪元以来的秒数的4字节值,5字节 随机值和以随机值开头的3字节计数器。在里面 MongoDB,存储在集合中的每个文档都需要唯一的
\u id
用作主键的字段。如果插入的文档忽略了
\u id
字段,MongoDB驱动程序自动生成ObjectId 用于
\u id
字段

这也适用于通过使用的更新操作插入的文档 厄普塞特:没错

MongoDB客户端应该添加一个带有唯一ObjectId的
\u id
字段。 为
\u id
字段使用ObjectID可提供以下附加功能 优点:在mongo shell中,您可以访问 ObjectId,使用
ObjectId.getTimestamp()
方法。根据_id进行排序 存储ObjectId值的字段大致相当于按排序 创建时间

重要
而ObjectId值应随时间增加 时间,它们不一定是单调的。这是因为:

仅包含一秒钟的时间分辨率,因此ObjectId值 在同一秒内创建的没有保证的顺序,以及 由可能具有不同系统时钟的客户端生成。

显式声明
\u id
: 当显式声明
\u id
字段时,请指定
auto
选项:

newschema({u id:{type:Schema.ObjectId,auto:true})
仅ObjectId-如果启用为true,则添加自动生成的ObjectId默认值。


TL;博士
如果创建一个没有_id字段的新文档,MongoDB会自动创建该字段并分配一个唯一的BSON ObjectId

这是一个很好的方法

在模型中:

const schema = new Schema({ userCurrencyId:{type: mongoose.Schema.Types.ObjectId,
        index: true,
        required: true,
        auto: true});

是的,并且不需要在模式中包含
\u id
字段。@JohnnyHK,您和Last Rose Studio是正确的。正如你所说的那样。我注释掉了行“\u id:ObjectIdSchema”,当我新建Person()时,它就有了id!但是当我没有把它注释掉时,这个id就从来没有生成过。谢谢大家!非常感谢。对于新观众来说,从那以后这种行为有没有改变?今天我不得不提到
default:new mongoose.Types.ObjectId()
,如果我在模型架构中添加
\u id
,没有它就无法工作!我可以使用节点版本4.8.1回应上述注释,如果在模式中声明了_id,_id将不会自动生成这是不必要的。。。如果不指定_id是什么,它默认为ObjectId并创建自身[错误:文档在保存前必须有_id]此答案仍然有用,因为子文档(例如)没有自动生成的_id这仍然是实际的,特别是对于Docked mongo imageIt解决了我的问题,感谢无需在MongoDB中明确指定
\u id
,存储在集合中的每个文档都需要一个唯一的_id字段作为主键。如果插入的文档省略了_id字段,MongoDB驱动程序会自动为_id字段生成ObjectId。
。这是确切的答案,也是唯一有效的方法。谢谢