首页 文章

猫鼬的人口如何运作

提问于
浏览
1

我想使用 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 回答

  • 1

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

    要了解你的代码无法正常工作的原因,我需要知道你是如何创建对象的,但是我快速浏览一下,我认为这可能是因为你将模型名称指定为'book'并在ref'Book'中使用,我相信猫鼬是区分大小写的 .

  • 2

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

相关问题