【问题标题】:Mongoose: Filtering query resultsMongoose:过滤查询结果
【发布时间】:2016-03-21 18:16:07
【问题描述】:

我正在构建一个 Express + Mongoose 网络应用程序,在我的一个视图中,我需要显示模型中对象的不同子集。

具体来说,我 ping Mongo 以获取 Applications 模型中的所有文档。每个应用程序可以有不同的属性:提交日期、是否有评论(嵌入文档)、是否有属于当前登录用户的评论等。

我正在尝试加载所有应用程序(我需要),然后还创建此数组的副本,其内容根据上述属性进行过滤。所以最后,我会有一个包含 allApps、recentApps、reviewApps、myReviewedApps 等数组的哈希。

Mongoose 是否有一种方法可以让我进一步过滤查询结果而无需 ping 数据库?还是应该改为异步运行多个查询,然后将其传递给视图?

控制器

  list: function(req, res) {
    Application.find({}).populate('owner').exec(function (err, apps) {
      if (err) console.log(err);
      res.render('applications/list', {
        apps: apps,
        // other subsets of apps here
      });
    })
  },

模板

<div class="tab-content">
  <div role="tabpanel" class="tab-pane content-buffer-plus active" id="all">{{> _tableAllApps apps=apps }}</div>
  <div role="tabpanel" class="tab-pane fade content-buffer-plus" id="to-review">{{> _tableToReviewApps apps=apps }}</div>
  <div role="tabpanel" class="tab-pane fade content-buffer-plus" id="your-reviewed">{{> _tableYourReviewedApps apps=apps }}</div>

  <!-- these ones aren't done and I'm not even sure what to od about them yet... -->
  <div role="tabpanel" class="tab-pane fade content-buffer-plus" id="all-reviewed">{{> _tableAllReviewedApps apps=apps }}</div>
  <div role="tabpanel" class="tab-pane fade content-buffer-plus" id="waitlisted">{{> _tableAllApps apps=null }}</div>
  <div role="tabpanel" class="tab-pane fade content-buffer-plus" id="accepted">{{> _tableAllApps apps=null }}</div>
</div>

【问题讨论】:

  • 我在 MongoDB 文档中找到的另一个答案。 [$addToSet][1] 允许用户创建“别名”数组属性,对每个 $group 修饰符中的项目进行分组。由于我没有经常练习 MongoDB(或 Mongoose),所以我不能举个例子。 [1]:docs.mongodb.org/manual/reference/operator/aggregation/addToSet

标签: node.js mongodb mongoose


【解决方案1】:

也许您应该重新设计您的应用程序模型以应用discriminatoraggregate 功能。

【讨论】:

    【解决方案2】:

    如果后续过滤相当简单,例如日期间隔或布尔标志,您可以通过 mongoose 查询最通用的集合,并在 mongoose 之外进行其他过滤。例如,假设您通过 mongoose 查询获取 allApps,然后您可以使用类似这样的简单过滤器获取 recentApps

    var recentApps = allApps.filter(function (app) { return (Date.now() - appDate) > threshold; });
    

    或用于已审核的应用

    var reviewedApps = allApps.filter(function (app) { return app.isReviewed; });
    

    对于更复杂的过滤,尽管您必须使用不同的查询再次调用 mongoose

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-14
      • 2012-04-20
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多