在我的申请中,有2个藏品。
1.profile - 字段是:用户名,ID,城市和邮政编码
2.material - id,version,descrption and usage
在单一收藏中,我们使用如下所示:
var query = {};
query.username = 'xxxx';
query.city= 'yyyy';
需要多个集合查询,如下图所示?
是否需要查询以在材料中传递用户名和城市以及描述?
答案 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});
});
包装有很多选择,所以我会留给您找到最适合您需求的包装,如果您选择了这条路线,请阅读文件。