我有一个名为Events
的集合。每个Event
文档都有一个Participants
集合作为嵌入文档。
现在是我的问题..有没有办法查询Event
并获取所有Participants
那个。年龄> 18?
答案 0 :(得分:1)
在MongoDB中查询集合时,默认情况下会返回与查询匹配的整个文档。如果需要,可以对其进行切片并检索单个子文档。
如果你想要的只是18岁以上的参与者,那么最好做两件事之一:
将它们存储在名为“Over18”的事件文档内部的子文档中。将它们插入到该文档中(如果需要,可以插入另一个文档),然后在查询集合时,可以指示数据库仅返回“Over18”子文档。这样做的缺点是你将参与者存储在两个不同的子文档中,你必须在插入之前弄清楚他们的年龄。根据您的申请,这可能是也可能不可行。如果你需要能够检查任意年龄(即有时是18岁,有时是21岁或25岁等),那么这将不起作用。
查询集合并检索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。