mongoose人口的工作原理

我想使用Mongoose Population并从其他collections中获取一些信息。 我的模特是:

 var mongoose = require('mongoose'); var Users = require('../users'); var schema = new mongoose.Schema({ book_name: String, book_publisher: String }); var book = mongoose.model('book', schema); module.exports = book; 

 var mongoose = require('mongoose'); var Book = require('../book'); var Schema = mongoose.Schema; var schema = new mongoose.Schema({ user_name: String, books: [{ type: Schema.Types.ObjectId, ref: 'Book' }] }); var users = mongoose.model('users', schema); module.exports = users; 

我想将每个用户书籍存储在books field ,并从Books collection填充它们。 但我不明白,这种联系是如何发生的? 我的Users架构如何连接到Book架构? 我的意思是,书架中的_id字段应该和用户架构中的_id相同? 我没有详细说明任何关系,但是在我阅读的每一篇教程中,他们都是这样的。 我想分别填充每个用户的书籍,但是在两个集合中比较的关键项目是什么? 我有办法find方法吗? 这是我的发现:

 Users.find({book_name:name).populate('books').exec( function(err, users) { if (err) { throw err; } var new_user = users; } ); 

事实上,我的问题是,这是怎么实现的。 我从来没有说过图书架构中的哪个领域涉及到用户架构。 我很困惑。

而现在,当我运行这个,我没有得到填充字段,它是空的。 我应该写一个保存方法,保存的项目必须在这个关系? 在我的应用程序,这两个集合分开填写,并从不同的来源。

填充函数是这样工作的,你在schema中指定字段(在本例中为books)是一个ObjectId,它的ref是模型Book,当你填充时,mongoose转到Book集合并search模型您在User中指定的书的Id,因此他将该字段转换为Book字段而不是ObjectId。

要知道为什么你的代码不起作用,我需要知道你是如何创build对象的,但是快速浏览一下,我认为这可能是由于你指定模型名称为'book',并在'Book' ,我相信mongoose是区分大小写的。

您的Books集合中的_id应该是唯一的(不重复)。 在用户模式的书籍数组中,您应该存储书籍_id的。 mongoose会用这些_ID来做人口。