Javascript 如何防止mongoose插入ObjectID而不是嵌入它
我有两本MongoDB藏书,如下所示(一个图书馆只有一本书用于演示): 我为这样的库创建了一个模式Javascript 如何防止mongoose插入ObjectID而不是嵌入它,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有两本MongoDB藏书,如下所示(一个图书馆只有一本书用于演示): 我为这样的库创建了一个模式 export const LibrarySchema=新架构({ 姓名:{ 类型:字符串, 要求:正确, }, 书籍:{ _id:错, 类型:Schema.Types.ObjectId,//(1) ref:“Book”//是的,模式已正确注册,它被称为“Book”` } }) (1)我有ObjectID,因为(如收藏中所示)书籍是使用ObjectID引用存储的,如果我将它们更改为书籍模式,则在填
export const LibrarySchema=新架构({
姓名:{
类型:字符串,
要求:正确,
},
书籍:{
_id:错,
类型:Schema.Types.ObjectId,//(1)
ref:“Book”//是的,模式已正确注册,它被称为“Book”`
}
})
(1)我有ObjectID,因为(如收藏中所示)书籍是使用ObjectID引用存储的,如果我将它们更改为书籍模式,则在填充时将无法再找到它们
现在,问题来了,我的目标是要有一个原始的收藏,其中嵌入了所有的图书馆和他们的书,如下所示:
// library_complete
| _id | name | book |
| ObjId("xxx") | foobar | { author: "jean", title: "foo"} |
| ObjId("xxx") | booky | { author: "baz", title: "boo"} |
(请不要问我为什么需要原始(嵌入式)集合,我已经复制了我的目标,使其尽可能容易理解,拥有原始(嵌入式)集合是绝对必要的)
原始库集合的模式如下:
const RawLibrarySchema=新模式({
姓名:{
类型:字符串,
必填项:true
},
书籍:{
_id:错,
类型:BookSchema,//将其更改为'Object'也不起作用
}
})
现在,在服务中,当我想要创建一本书时
const linkLibaryToBook=async(库,bookId)=>{
//一些复杂的计算将图书馆链接到书籍并填充
const libraryBook=wait someComplexFunction(library,bookId);//在该函数中,将填充书籍,请参见下面的返回类型
控制台日志(libraryBook);
/*@返回
图书{
名称:“foobar”,
书:{作者:“jean”,书名:“foo”},
}
*/
图书馆(图书馆图书);
}
上面的返回类型正是我想要实现的,当我像下面那样写下它时
const saveRawLibrary=async(libraryObject)=>{
console.log(libraryObject);
/*@返回
图书{
名称:“foobar”,
书:{作者:“jean”,书名:“foo”},
}
//^这是应该的^
*/
const_library=新的libraryModel(libraryObject);
console.log(_库);
/*@返回
_图书馆{
名称:“foobar”,
书:“9023920dada032aa”//原书的objectId
}
//^这就是结果^
*/
}
突然,猫鼬将书的ID链接到了图书馆,而不是对象。我只想像前两个控制台日志中所示那样将普通对象写入。我也尝试过使用这样的简单创建:
const saveRawLibrary = async (libraryObject) => {
await libraryModel.create(libraryObject);
}
然而,这是完全相同的,它只是引用它的id。。。有没有办法简单地插入一个对象?如果你想看到真实的物体和结果,你可以
TL;博士我有一个JavaScript对象,我想把它写下来,但如果我这样做了,它会神奇地分配ObjectID,而不是原始对象。试试这种方法
const mongoose = require('mongoose');
const bookSchema = new mongoose.Schema({
title: String,
author: String,
library: {
type: mongoose.Types.ObjectId,
ref: 'library'
},
})
const librarySchema = new mongoose.Schema({
name: String,
book: {
type: mongoose.Types.ObjectId,
ref: 'book'
}
});
const Book = mongoose.model('Book', bookSchema);
const Library = mongoose.model('Library',librarySchema);
const book1 = new Book({
_id: new mongoose.Types.ObjectId(),
author: 'Ian Fleming',
title: 'Casino Royale',
});
console.log(book1);
book1.save(function (err) {
if (err) return handleError(err);
});
const library1 = new Library({
name: 'AMsterdaam',
book: book1._id // assign the _id from the book
});
library1.save(function (err) {
if (err) return handleError(err);
});
console.log(library1);
输出
{
_id: 5f6f2d7e734c4e285e399460,
author: 'Ian Fleming',
title: 'Casino Royale'
}
{
_id: 5f6f2d7e734c4e285e399462,
name: 'AMsterdaam',
book: 5f6f2d7e734c4e285e399460
}
你必须使用populate方法。是的,请阅读该方法返回的控制台日志。你能发布bookSchema吗?好的,它只是一个带有作者字符串和标题字符串的模式,没有别的了。我在函数中添加了一些注释,以便更清楚地说明它们的作用,请看一看:)我已经在
someComplexFunction()中这样做了
函数,它为我提供了要写入的填充对象
{
_id: 5f6f2d7e734c4e285e399460,
author: 'Ian Fleming',
title: 'Casino Royale'
}
{
_id: 5f6f2d7e734c4e285e399462,
name: 'AMsterdaam',
book: 5f6f2d7e734c4e285e399460
}