如何为mongoDB设计模式

时间:2013-01-04 01:32:26

标签: node.js mongodb mongoose

在Node.js + Mongoose中,我想在收藏文章中找到一些用户的评论。

设计1:

articles:
{
    ...
    users: ["a@a.com","b@b.com","c@c.com"]
    comments: [
        {email:"a@a.com", comment:"..."},
        {email:"b@b.com", comment:"..."},
        {email:"c@c.com", comment:"..."},
        ...
    ]
}

设计2:

articles:
{
    ...
    comments: [
        {email:"a@a.com", comment:"..."},
        {email:"b@b.com", comment:"..."},
        {email:"c@c.com", comment:"..."},
        ...
    ]
}

我正在使用设计1,首先找到{users:req.query.user},然后从结果中检索用户的评论。但我觉得这不聪明。有没有像解决方案2的方法,我不知道如何编写数据库查询。

1 个答案:

答案 0 :(得分:0)

您对第二个结构的查询实际上就是这么简单。在mongo shell上它将是:

db.collection_name.find({'comments.email': 'a@a.com'})

查询引擎非常智能,可以内省该数组并返回符合要求的文档。

从那时起,您只需要遍历应用程序代码中的注释,并使用匹配的电子邮件提取这些注释。如果这是您构建数据的方式,则无需在查询时进行此限制。根据需要遍历所有评论。

如果将结果集限制为仅针对特定用户的注释很重要,您可以重新考虑将对象结构化为更具关系性的方式(可能是与文章集合相关的每个注释的文档?尝试根据查找潜力的重要值来考虑您的模式,并在可能的情况下将它们编入索引。