使用Meteor准备搜索多个集合的查询?

时间:2015-04-23 10:34:02

标签: meteor

在我的申请中,有2个藏品。

1.profile - 字段是:用户名,ID,城市和邮政编码

2.material - id,version,descrption and usage

在单一收藏中,我们使用如下所示:

 var query = {};
query.username = 'xxxx';
query.city= 'yyyy';

需要多个集合查询,如下图所示?

是否需要查询以在材料中传递用户名和城市以及描述?

1 个答案:

答案 0 :(得分:3)

MongoDB不支持关系数据库(例如MySQL)的连接方式。关于这个问题有很多材料,主要是......

这些都归结为:它在MongoDB中不是原生的,但是对于Meteor,你有三种选择:

  • 使用包为您执行
  • 反规范化(将一个集合完全包含在另一个集合中)
  • 通过发布和路由自行完成

来自你的评论:

  

在Profile Id中,材料也是id。所以这两个是相同的

听起来id字段是您想要加入的 - 第二个选项(去标准化)非常简单,如果您可以侥幸逃脱它。不是拥有两个集合,而是使用以下格式的一个集合:

{
  username,
  material: { 
    version,
    description,
    usage
  },
  city,
  postalcode
}

然后查询如下:

Profiles.find({username: 'xxxx', city: 'yyyy', "material.description": "zzzz"});

在存储效率和可重用性方面存在明显的权衡(例如,如果您在其他地方使用了material集合,则无法将其嵌入profile集合中)。请注意,如果您有许多具有相同描述的材料,这也适用。

如果你需要将它们分开,你可以缩小要手动查看的字段集(选项3) - 你可以看到我在MeteorPad上的表现,但基本的想法是你的发布函数,首先查询一个Collection,然后使用该信息查询另一个:

// Return all profiles with a certain material description -- includes multiple materials.
Meteor.publish('profiles', function(username, city, material) { 
  var materialIds = Materials.find({description: material}).map(function(mat) { return mat._id });

  return Profiles.find({material: {$in: materialIds}, username: username, city: city});
});

包装有很多选择,所以我会留给您找到最适合您需求的包装,如果您选择了这条路线,请阅读文件。