2015-04-23 136 views
-1

在我的应用程序2集合在那里。准备使用流星搜索多个集合的查询?

1.profile - 菲尔兹是:用户名,身份证,城市和邮递区号

2.材质 - ID,版本,descrption和使用

在我们为使用单个集合如下图所示:

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

需要多个集合查询如下所示数据?

需要查询才能通过用户名和城市在配置文件descrption在材料?

+0

这两个集合是如何关联的?为什么你必须使用一个查询而不是单独查询它们? –

+0

在配置文件ID是否有材料也是id there.So这两个是相同的@ Carson Moore – user2344293

回答

3

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

这些什么都归结为是这样的:它不是本地的MongoDB中,但是对于流星,你有三种选择:

  • 使用一个包到d Ø为你
  • 反规范化(包括一个收集完全在其他)
  • 自己与出版这样做,可以路由

从您的评论:

在配置文件ID为有和材料也id在there.So这两个是相同的

它听起来像id字段是你想要jo在这里 - 第二个选项(解除归一化)在这里非常容易,如果你可以避开它。而不是具有两个类别,有一个收集在下面的格式:

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

然后查询像这样:

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

这在存储效率和可重用性方面具有明显的折衷(例如,如果你的material系列在其他地方使用,你不能真正将它嵌入profile系列)。请注意,如果您有许多具有相同描述的材料,这也适用。

如果您需要将它们保持分开,您可以缩小字段集以手动查找(选项3) - 您可以看到我如何在MeteorPad上做到这一点,但基本思想是在发布功能中,查询一个集合,然后再利用这些信息来查询对方:

// 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}); 
}); 

有很多的软件包的选择,所以我会离开它给你找到一个最适合您的需求和阅读该文件是否是您选择的路线。

+0

这对我不适用@ Carson Moore – user2344293

+1

@ user2344293它不起作用?我很乐意帮忙,但除非我知道更多,否则我不能这样做。这些解决方案不适合您的使用情况吗?你有错误吗? MeteorPad例子没有意义吗?你有什么尝试? –

+0

准确地说,我需要搜索像过滤器例如基本上过滤器查询是基于配置文件字段和一个更多的选项也是给搜索字段是材料descrption.So dcscrption不是单身它可能存在重复。这一次得到的结果就像不检查配置文件但materaila descrption将check.so可以为此编写查询?@Carson Moore – user2344293