【问题标题】:How to design the schema for mongoDB如何为 mongoDB 设计模式
【发布时间】:2013-01-04 09:42:50
【问题描述】:

在 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} ,然后从结果中检索用户的 cmets。但我觉得它不聪明。有没有类似方案2的方法,我不知道怎么写数据库查询。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您对第二个结构的查询实际上同样简单。在 mongo shell 上会是:

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

    查询引擎足够智能,可以自省到该数组并返回符合要求的文档。

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

    如果将结果集限制为仅针对特定用户的 cmets 很重要,那么您可能需要重新考虑将对象构造成更具相关性的方式(也许每个评论的文档都与文章集合相关? ) 尝试根据查找潜力方面的重要值来考虑您的架构,并在可能的情况下对它们进行索引。

    【讨论】:

    • 感谢您的帮助。我正在使用猫鼬,find({cmets.email:req.query.user} 出现错误:SyntaxError: Unexpected token . at Module._compile (module.js:437:25) at Object.Module._extensions..js ( module.js:467:10) 在 Module.load (module.js:356:32)
    • 直接查询语法应该没有问题,所以一定是Mongoose处理查询构造的问题。登录时req.query.user 的值是多少?
    • req.query.user = a@a.com, Article 是一个模型,在我的 app.js 中,代码是:Article.find({cmets.email:req.query.user}
    • JS 语法不喜欢键中的那个点。您可以尝试引用密钥吗?我意识到您通常不会在 JS obj 哈希中这样做,但可能需要在此处传递一个字符串表示来绕过那个意外的令牌错误。 Article.find({'comments.email':req.query.user})
    • 在这里查看文档中的第一个示例,使用点语法但带有引号:mongoosejs.com/docs/queries.html
    猜你喜欢
    • 2018-02-13
    • 2015-06-27
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2015-01-26
    • 2016-03-29
    • 2023-03-03
    相关资源
    最近更新 更多