【问题标题】:How mongoose population works猫鼬种群的工作原理
【发布时间】:2015-10-17 23:58:38
【问题描述】:

我想使用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 相同?我没有具体说明我认为的任何关系,但在我阅读的每个教程中,它们都是这样的。我想分别填充每个用户书籍,但是在两个集合中进行比较的关键项目是什么?我在查找方法中做了什么吗?这是我的发现:

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

事实上我的问题是,.populate('books') 是如何工作的。我从不说书籍模式中的哪个字段与用户模式相关。我糊涂了。

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您的图书收藏中的 _id 应该是唯一的(没有重复)。在用户模式的书籍数组上,您应该存储书籍_id。 Mongoose 将使用这些 _id 来进行人口统计。

    【讨论】:

    • 但是它如何区分哪本书属于特定用户?
    • 如果我理解正确的话,一个用户可以拥有多本书,而一本书可以属于多个用户,对吧?所以这是一个多对多的关系。有几种方法可以用 MongoDB 建模多对多关系。您必须根据要执行的查询类型进行选择。我建议您阅读以下内容:blog.markstarkman.com/blog/2011/09/15/…
    • 是的,你是对的,但为此我在网上一无所获。我不明白每本书是否都有唯一的_id,我如何找出每本书属于哪个用户。我读了很多,但我找不到。
    • 在用户集合中查找图书 ID 的一个选项,这样您就可以找出哪个用户拥有该图书。
    • 但用户收藏不存储属于每个用户的书籍。它应该在运行时填充并保存到书籍字段中。不是吗?请看我上面的代码。我糊涂了。我在哪里误解了?
    【解决方案2】:

    填充函数的工作原理是这样的,您在架构中指定字段(在本例中为书籍)是一个 ObjectId,并且它的 ref 是模型“Book”,当您填充时,猫鼬会进入 Book 集合并搜索具有您在用户中指定的图书 ID 的模型,因此他将字段转换为图书字段而不是 ObjectId。

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

    【讨论】:

    • 那么书本架构中的_id可以重复吗?因为我希望一个用户可以拥有不止一本书!
    猜你喜欢
    • 2016-07-31
    • 2018-09-13
    • 2019-09-13
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 2018-02-10
    • 2013-11-27
    相关资源
    最近更新 更多