【问题标题】:Node.js can not set default UUID with mongooseNode.js 无法使用 mongoose 设置默认 UUID
【发布时间】:2018-06-25 22:36:20
【问题描述】:

我试图在 mongoose / Node.js / Express 中为我的 我的架构模型中的 _id 字段...

/**Demonstrator
 * 
 */
var mongoose = require('mongoose')
var uuid = require('node-uuid')
require('mongoose-uuid2')(mongoose);
var Schema = mongoose.Schema;
require('mongoose-long')(mongoose);
var Status = require('./Status');
var StatusSchema = Status.Schema; 
var SchemaTypes = mongoose.Schema.Types;
const uuidv4 = require('uuid/v4');
var UUID = mongoose.Types.UUID;

var DemonstratorSchema = new Schema({
    //_id: SchemaTypes.Long;
    _id: { type: String, default: uuidv4()},
    id2: SchemaTypes.Long,
    Test: String,    
})

module.exports = mongoose.model("Demonstrator", DemonstratorSchema);
console.log("DemonstratorSchema created!");

我还尝试编写一个自己的函数,例如这篇文章: Using UUIDs in mongoose for ObjectID references,但这也不起作用...它只是不会在我的数据库中使用猫鼬创建默认生成的 UUID,为什么?

编辑:我刚刚发现,它创建了一个具有 32 字节 UUID 值的 UUID 或字符串字段,我只是无法直接在 mongo shell 中执行此操作,尽管我认为我的 Schema 有点强制执行此操作,但它合乎逻辑的是,这是无稽之谈,因为 mongo Shell 不知道我的后端约束;)对此感到抱歉....但是也可以安全地假设,任何来自生成的 REST API 端点(POST)并保存在我的后端,是否会自动创建 UUID?

推荐使用什么作为 UUID 版本? v1?还是 v4 甚至 v5?

【问题讨论】:

    标签: node.js mongodb mongoose uuid


    【解决方案1】:

    default 属性应该是一个返回字符串(在您的情况下为 UUIDv4 值)的函数。

    不过,这不是您的架构提供的:

    _id: { type: String, default: uuidv4()}
    

    该声明将运行uuidv4 函数,该函数返回一个字符串,并使用该字符串作为默认值。类似这样:

    _id: { type: String, default: 'FA6281FF-5961-4F2F-8270-D6AB9954410D'}
    

    相反,将引用传递给uuidv4 函数:

    _id: { type: String, default: uuidv4 }
    

    这样,每次需要默认值时,Mongoose 都会调用该函数,该函数每次都会返回一个新的 UUID。

    【讨论】:

    • 好的,它是这样工作的,但还有一个问题:如果我将类型定义为 UUID,它会以我认为的二进制形式创建 UUID,就像 ObjectId 一样:UUID("FA6281FF-5961-4F2F-8270 -D6AB9954410D"),这有什么好处?与字符串相比,索引这些键是否更快,或者它们是否节省更多空间并且查询速度更快?我应该使用 UUID 类型还是更喜欢字符串?查询 UUID 或字符串更容易吗?那么 UUID 的字符串查询是否会自动转换为 UUID 类型的查询?
    • @user2883596 您的问题大多在README 中进行了解释:“当使用 UUID 代替 String 时,UUID 将以二进制格式存储,大约占用一半的空间。” i> 和 “它会自动将字符串转换为二进制,当从数据库中读取文档时,如果您直接访问属性,您会以字符串的形式返回值。”.
    • 很酷,感谢您的链接,因此我推断使用 UUID 数据类型会更好
    • @user2883596 是的,它会为您节省一些空间,而且使用它时听起来不会对性能产生任何影响。
    猜你喜欢
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2021-11-30
    • 2016-08-05
    相关资源
    最近更新 更多