Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止mongoose插入ObjectID而不是嵌入它_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 如何防止mongoose插入ObjectID而不是嵌入它

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引用存储的,如果我将它们更改为书籍模式,则在填

我有两本MongoDB藏书,如下所示(一个图书馆只有一本书用于演示):

我为这样的库创建了一个模式

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
}