我想使用Mongoose
Population
并从其他集合中获取一些信息。我的模特是:
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;
}
);
实际上我的问题是.populate('books')
如何运作。我从不说书架构中哪个字段与用户架构相关。我糊涂了。
现在当我运行这个时,我在填充的字段中什么都没有,它是空的。我应该写一个保存方法,保存的项目必须在这种关系下吗?在我的应用程序中,这两个集合分别填写,来自不同的来源。
答案 0 :(得分:2)
populate函数的工作原理如下,你在模式中指定字段(在本例中为books)是ObjectId,它的ref是模型'Book',当你填充时,mongoose转到Book集合并搜索具有您在User中指定的书的Id的模型,因此他将字段转换为Book字段而不是ObjectId。
要了解为什么你的代码不起作用,我需要知道你是如何创建对象的,但是我快速浏览一下,我认为这可能是因为你将模型名称指定为'book'并在ref中使用“预订”,我相信猫鼬是区分大小写的。
答案 1 :(得分:1)
Books集合中的_id应该是唯一的(没有重复项)。在用户架构的书籍数组上,您应该存储书籍_id。猫鼬将使用那些_ids来填充人口。