猫鼬的人口如何运作

时间:2015-07-27 17:10:20

标签: node.js mongodb mongoose

我想使用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')如何运作。我从不说书架构中哪个字段与用户架构相关。我糊涂了。

现在当我运行这个时,我在填充的字段中什么都没有,它是空的。我应该写一个保存方法,保存的项目必须在这种关系下吗?在我的应用程序中,这两个集合分别填写,来自不同的来源。

2 个答案:

答案 0 :(得分:2)

populate函数的工作原理如下,你在模式中指定字段(在本例中为books)是ObjectId,它的ref是模型'Book',当你填充时,mongoose转到Book集合并搜索具有您在User中指定的书的Id的模型,因此他将字段转换为Book字段而不是ObjectId。

要了解为什么你的代码不起作用,我需要知道你是如何创建对象的,但是我快速浏览一下,我认为这可能是因为你将模型名称指定为'book'并在ref中使用“预订”,我相信猫鼬是区分大小写的。

答案 1 :(得分:1)

Books集合中的_id应该是唯一的(没有重复项)。在用户架构的书籍数组上,您应该存储书籍_id。猫鼬将使用那些_ids来填充人口。