【问题标题】:Subquery to get Categories and data获取类别和数据的子查询
【发布时间】:2016-05-01 05:02:41
【问题描述】:

使用 MongoDB、NodeJs 和 Meteor,我有 2 个这样的集合设置:

分类: * 食物 * 生活方式 * 其他

项目:

1. CategoryId: 1 (food)
* Pizza

2. CategoryId: 1 (food)
* Spaghetti

3. CategoryId: 2 (lifestyle)
* Ziplining

4. CategoryId: 2 (lifestyle)
* Fishing

最终,我试图在模板中生成如下所示的结果:

Food:
 * Pizza
 * Spaghetti

Lifestyle:
 * Ziplining
 * Fishing

Other:

我认为最好的方法是执行一个查询,拉入类别,提取类别 ID,然后使用类别 ID 进行第二次查询,循环遍历结果并将它们拼接在一起成一个单一的、多维的 json 对象,我可以用模板解析它。 现在到了棘手的部分……我无法找到有关如何执行此操作的文档,因为主要是 mongo 是为非规范化数据设计的。

【问题讨论】:

  • 你能展示一些示例文档吗?
  • 如果你正在寻找代码,我没有这个。此刻我感到有些失落。我的类别集合如下所示:evernote.com/l/ASICpfUhw09PD5QRWsd_LHSzFl5C02judkg 我对 MongoDB 还很陌生,所以我没有意识到 _id 不是一个简单的整数。

标签: node.js mongodb meteor mongodb-query


【解决方案1】:

其实做起来很简单:

let categoryId = Categories.findOne({<Your query here>});
let resultCursor = Items.find({CategoryId:categoryId});

第一行的查询取决于您的文档结构。

【讨论】:

  • 不完全是我所追求的,但我不确定我真的能得到我所追求的。我刚刚提取了集合,id 不是简单的整数,而是 objectId。看起来我必须以某种方式使用 DBRef,但我不确定这是否值得。我的分类收藏截图:evernote.com/l/ASICpfUhw09PD5QRWsd_LHSzFl5C02judkg
  • 所以我要做的是对类别进行一次查询,获取所有类别,然后对项目集合进行查询并提取与这些类别关联的所有项目.
  • 它仍然可以工作。只需在第一个语句中使用 find() 而不是 findOne() 并在第一个语句的循环内执行第二个语句。
【解决方案2】:

假设您的Items 看起来像{ _id, categoryId, name },而您的Categories 看起来像{ _id, name }

那么您只是想显示跨两个集合的层次结构。

火焰(html):

<template name="hierarchy">
<ul>
{{#each categories}}
  <li>{{name}}</li>
  <ul>
  {{# each items _id }} <!-- here _id is the _id of a category -->
    <li>{{name}}</li>
  {{/each}}
  </ul>
{{/each}}
</ul>
</template>

助手(js):

Template.hierarchy.helpers({
  categories: function() {
    return Categories.find({},{sort: {name: 1}})
  },
  items: function(_id){
    return Items.find({categoryId: _id},{sort: {name: 1}})
  }
});   

【讨论】:

  • 是的!这正是我正在寻找的。以后我得试试。谢谢!
猜你喜欢
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多