MongoDB - 查询嵌入文档

时间:2011-06-21 13:19:43

标签: mongodb

我有一个名为Events的集合。每个Event文档都有一个Participants集合作为嵌入文档。

现在是我的问题..有没有办法查询Event并获取所有Participants那个。年龄> 18?

3 个答案:

答案 0 :(得分:1)

在MongoDB中查询集合时,默认情况下会返回与查询匹配的整个文档。如果需要,可以对其进行切片并检索单个子文档。

如果你想要的只是18岁以上的参与者,那么最好做两件事之一:

  1. 将它们存储在名为“Over18”的事件文档内部的子文档中。将它们插入到该文档中(如果需要,可以插入另一个文档),然后在查询集合时,可以指示数据库仅返回“Over18”子文档。这样做的缺点是你将参与者存储在两个不同的子文档中,你必须在插入之前弄清楚他们的年龄。根据您的申请,这可能是也可能不可行。如果你需要能够检查任意年龄(即有时是18岁,有时是21岁或25岁等),那么这将不起作用。

  2. 查询集合并检索Participants子文档,然后在应用程序代码中对其进行过滤。尽管有些人可能会相信,但这并不可怕,因为你不希望你的数据库一直在做太多的工作。将计算卸载到您的应用程序实际上可以使您的数据库受益,因为它现在可以花费更多的时间查询和更少的时间过滤。从长远来看,它可以带来更好的可扩展性。

答案 1 :(得分:0)

简答:不。我试图在几个月前做同样的事情,但mongoDB不支持它(至少在版本< = 1.8)。他们的Google小组确实提出了同样的问题。您可以将参与者存储为单独的集合,也可以获取整个文档,然后在客户端上对其进行过滤。我知道,远非理想。我还在试图找出解决这个限制的最佳方法。

答案 2 :(得分:0)

供将来参考:这可以在MongoDB 2.2中使用新的聚合框架,通过聚合如下:

db.events.aggregate(
  { $unwind: '$participants' }, 
  { $match: {'age': {$gte: 18}}},
  { $project: {participants: 1}
)

这将返回n个文档的列表,其中n是参与者的数量> 18其中每个条目都是这样的(请注意,“参与者”数组字段现在只包含一个条目):

{ 
  _id: objectIdOfTheEvent, 
  participants: { firstName: 'only one', lastName: 'participant'} 
}

甚至可能在服务器上展平以返回参与者列表。有关详细信息,请参阅officcial documentation

相关问题