因此,我一直在与猫鼬中嵌套UUID的问题作斗争,这在以下堆栈溢出文章中概述了
Mongoose and array of ref UUID's does not convert
但是,经过更多的测试和研究,我发现这破坏了我代码的另一部分,该代码用于更新我用于系统的文档。由于此代码很复杂,因此我将提供一个创建相同条件的简单示例。
在安装以下nodejs软件包后
“猫鼬”:“ ^ 5.6.10”, “ mongoose-uuid2”:“ ^ 2.3.0”, “ uuid”:“ ^ 3.3.3”, “ uuid-mongodb”:“ ^ 2.1.1”
然后,按照上一篇文章中的概述更新mongoose-uuid2 index.js文件。
并最终设置以下代码来演示该问题:
var mongoose = require('mongoose');
var uuid = require("uuid-mongodb");
var Schema = mongoose.Schema;
require('mongoose-uuid2')(mongoose);
var UUID = mongoose.Types.UUID;
var TestISchema = Schema({
_id: { type: UUID, default: uuid.v4, required: true },
name: { type: String, required: true }
}, { id: false, toObject: {
"getters": true,
"virtuals": true,
"transform": function(doc, ret, options) {
delete ret._id;
return ret;
}
}, toJSON: {
"getters": true,
"virtuals": true,
"transform": function(doc, ret, options) {
delete ret._id;
return ret;
}
} });
var TestIISchema = Schema({
_id: { type: UUID, default: uuid.v4, required: true },
name: { type: String, required: true },
testIs: [{ type: UUID, ref: 'Product' }]
}, { id: false, toObject: {
"getters": true,
"virtuals": true,
"transform": function(doc, ret, options) {
delete ret._id;
return ret;
}
}, toJSON: {
"getters": true,
"virtuals": true,
"transform": function(doc, ret, options) {
delete ret._id;
return ret;
}
} });
TestIISchema.virtual("id").get(function() {
return uuidv4.from(this._id).toString();
});
TestIISchema.virtual("id").set(function(uuid_string) {
this._id = uuid.from(uuid_string);
});
TestISchema.virtual("id").get(function() {
return uuid.from(this._id).toString();
});
TestISchema.virtual("id").set(function(uuid_string) {
this._id = uuidv4.from(uuid_string);
});
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true});
var TestIModel = mongoose.model('TestI', TestISchema);
var TestIIModel = mongoose.model('TestII', TestISchema);
console.log(`Creating a new Test I document`);
var mytestI = new TestIModel({ "name": "testproduct"});
console.log(`Saving a Test I document`);
mytestI.save().then(() => {
console.log(`Getting all of Test I documents`);
return TestIModel.find({});
})
.then((results) => {
console.log(`Assigning Test I documennt ID's to an Test II document`);
var testIuuids = [];
results.forEach((result) => {
testIuuids.push(result.id);
});
mytestII = new TestIIModel(
{
"name": "testIIproduct",
"testIs": testIuuids
}
);
return Promise.resolve(mytestII);
})
.then((doc) => {
console.log(`Saving Test II`);
return doc.save();
})
.then((result) => {
console.log(result);
console.log(`Getting Test II by id ${result.id}`);
return TestIIModel.findById(result.id);
})
.then((document) => {
document.name = "testIIproduct2";
document.testIs = []
return document.save();
})
.then((result) => {
console.log(result);
})
.catch((error) =>{
console.log(error);
mongoose.disconnect();
});
在安装并执行以下错误后,最后一次保存会发生
。路径
_id
是必需的。
在进行故障排除并通过调试器运行它时,我可以看到代码经过更新的修补代码,并且如果我删除了上一篇文章中概述的mongoose-uuids的更新代码,它可以工作。但是,该帖子中概述的我以前的问题又回来了。我还尝试删除模式的第8行和第27行的“ required:true”,这在第96行的findById中产生了另一个错误:
未找到用于查询“ {_id:\'eacdf837-ee2c-4c61-9271-744234b67868 \'}的文档
我还尝试将第96行的findById更改为TestIIModel.find({“ id”:result.id}),但是模型找不到文档。
我对大文章表示歉意,但是如果没有所有这些信息,我找不到重新创建此问题的方法。同样作为背景,以这种方式使用UUID是必需的。我为此感到困惑,因此在此问题上的任何帮助将不胜感激。
答案 0 :(得分:0)
我能够找到此问题的解决方案。答案发布在
Mongoose and array of ref UUID's does not convert
它是对mongoose-uuid2库软件包的修改。
这是将第51行更改为57
if (value instanceof mongoose.Types.Buffer.Binary) {
if (init && doc instanceof mongoose.Types.Embedded) {
return getter(value);
} else {
return value;
}
}