Node.js 无法使用 mongoose 设置默认 UUID

use*_*480 4 uuid mongoose mongodb node.js

我试图在 mongoose / Node.js / Express 中为我的模式模型中的 _id 字段定义一个默认的 UUID ...

/**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!");
Run Code Online (Sandbox Code Playgroud)

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

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

推荐使用什么作为 UUID 版本?v1?或者更确切地说是 v4 甚至 v5?

rob*_*lep 11

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

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

_id: { type: String, default: uuidv4()}
Run Code Online (Sandbox Code Playgroud)

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

_id: { type: String, default: 'FA6281FF-5961-4F2F-8270-D6AB9954410D'}
Run Code Online (Sandbox Code Playgroud)

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

_id: { type: String, default: uuidv4 }
Run Code Online (Sandbox Code Playgroud)

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

  • @user2883596 你的问题主要在 [README](https://www.npmjs.com/package/mongoose-uuid2#what-does-it-do) 中解释:_"当使用而不是字符串时,将存储 UUID二进制格式,占用大约一半的空间。“_ 和 _”它自动将字符串转换为二进制,当从数据库读取文档时,您直接访问属性,您将值作为字符串返回。” _. (2认同)