【问题标题】:Populating count of records from other collection with Mongoose使用 Mongoose 填充来自其他集合的记录计数
【发布时间】:2015-10-13 13:38:52
【问题描述】:

我有 2 个 Mongoose 模型,Book 和 Users。我想这样做:当找到一本书时,我想获取当前图书用户的数量。

这是书本模型:

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 = new mongoose.Schema({
    user_name: String,
    book_id: String
});
var users = mongoose.model('users', schema);
module.exports = users;

我拿了这样一本书:

Book.find({book_name:name).exec(
        function(err, book) {
            if (err) {
                throw err;
            }
            var new_book = book;
        }
);

现在是代码获取一本书,但我想在用户模型中填充用户数并将它们添加到新获取的图书对象中。

我阅读了这份文件,但我无法做到: Population

【问题讨论】:

  • 如果您只需要计数,而不需要实际文档,为什么不在架构中添加另一个字段,如下所示:users_count: Number,并在每次新用户使用时更新它书?

标签: node.js mongodb mongoose


【解决方案1】:
User = new mongoose.Schema({
 //existing user properties
 owned_books: [{type: mongoose.Schema.Types.ObjectId, ref: 'book'}]
}}
var users = mongoose.model('users', User);

var schema = new mongoose.Schema({
  book_name: String,
  book_publisher: String,
  owner_ids: [{type: mongoose.Schema.Types.ObjectId, ref: 'users'}]
});
var book = mongoose.model('book', schema);

当您将人员添加到书籍或将书籍添加到人员时,您需要更新这两种架构。要获取当前图书用户,只需找到图书,然后获取其 owner_ids 字段的长度即可。

【讨论】:

  • 谢谢。你知道,我的主要问题是当我使用 find 方法来获取特定书籍时,在同一个查询中,获取 owner_ids 长度。事实上,我希望结果文档有一个包含 owner_ids 长度的字段。你能给我举个例子吗?现在我最关心的是,在取书后,我必须放置一个循环,并为每个结果文档计算 owner_ids 的长度并用其主要数据替换。但我是非常昂贵和奇怪的方式。你能帮我找到更好的方法吗?
  • 您不能同时使用 find 执行此操作。 Mongo只是没有这个能力。您可以使用 mongo 聚合框架来查找数组的长度。但是,它需要单独的查询,并且不是快速查询。您可以使用docs.mongodb.org/manual/reference/operator/aggregation/match docs.mongodb.org/manual/reference/operator/aggregation/unwind/… docs.mongodb.org/manual/reference/operator/aggregation/project docs.mongodb.org/manual/reference/operator/aggregation/sum/… 构建该查询
  • 那么你说我必须正常获取结果并将它们存储在一个对象中,然后运行聚合框架并进行更改。两个步骤。这是有效的吗?我认为我的数据库将负载过重。
  • 据我所知,有两种方法可以获取 mongo 文档中数组的长度。 1. 获取文档并在内存中检查长度。 2.获取不包括数组字段的文档,然后使用聚合框架进行单独查询以匹配您想要的文档,展开数组,将计数 1 投影到每个新行上,对计数求和,并可能按模型 id 分组如果那是你想要的。 Mongo 在关系类型数据方面确实很糟糕。如果您可以选择不使用它,我强烈建议您使用其他任何东西。
  • 你知道,我不需要那个数组来填充和获取他们的数据,我只需要计数。如果我编写一个 forEach 循环并为每个文档计算长度然后用所有数组替换它,它可以比聚合方法更快吗?
【解决方案2】:

您要执行的操作通常称为反向查找。幸运的是,有人已经为此创建了一个模块。它似乎不是一个非常常用的模块,但您可以查看它是否符合您的需求:reverse-populate

【讨论】:

    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 2013-03-23
    • 2021-04-01
    • 2017-08-26
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 2015-10-18
    相关资源
    最近更新 更多