繁体   English   中英

mongodb中的等效联合查询

[英]Joint query equivalent in mongodb

好的,我知道NoSQL数据库都是关于不使用关节进行查询的,但是我根本无法将某些概念束之高阁。 例如,假设我想拥有一个拥有多个作者和与该作者相关的文章的博客,在MySQL中,我将创建用户表:

Users: id, name, surname, nickname, password...
Articles: id, user_id, title, content, date, tags...

但是我不确定在MongoDB中正确设置此方法的最佳方法是什么。 我应该说:

db.users.insert({
    id:1,
    name: "Author name",
    ...
    articles: [{id:1, article:1, title:"Article title", ...}, {...}, ...]
});

我应该做这样的事情吗:

db.articles.insert(
    {
    ...
    article related stuff
    ...
    user related stuff: {...}
);

还是我应该为文章提供单独的数据库,为用户提供单独的数据库?

如果我有主页将显示10个最新文章摘录以及作者数据,那么在MySQL中,我将做一个联合查询以从作者表中获得作者昵称,从文章表中获得标题和摘录。

我真的不确定如何在面向文档的数据库中表示我的数据。 也许我应该在他的每篇文章中存储作者数据,但是如果作者更改了他的信息,那么该作者的所有文章都需要更新。

在我看来在MongoDB中创建单独的文档是合乎逻辑的。 一个将保存所有作者文档,一个将保存所有文章文档,但是这又将需要某种联合操作,该操作将获取前10条文章并从作者文档中获取作者数据。

好的,也许可以执行一些map reduce操作,但是我不确定它的外观。

感谢您对我的问题的想法和建议。 谢谢!

[编辑]另外,如果我把所有文章都保存在一个文档中,那么我对每个文档的限制是16 mb,如果网站很大,那将是一个问题,所以我想应该有单独的文章数据库?

首先,让我更正您的一些术语:

  • db.databaseName.insert({不正确。连接到数据库后,将文档插入集合中 。该行应写为db.articles.insert({

  • 目前最大文件大小为16MB

在这种情况下,我可能要做的就是将所有文章存储在一个文章集合中,其中一个字段是作者姓名 (或作者nick )。 这样做的原因主要是因为您提到这是您将在主页上大量运行的查询。 然后,您可以将其他作者信息存储在authors集合中的文档中。 每个作者的_id字段可以只是作者名称 (或作者nick )-根本不需要是“ ObjectId”类型,只要它是标量值(而不是数组)即可。

或者,您可以只将作者的所有文章作为嵌套数组存储在articles集合中,就像您在第一个示例中所示。 一个16MB的文件限制听起来可能有点小,但超出了您的想象。 例如,我博客上的477条文章仅占用2.4MB。

正如@Pavel已经提到的,我们假设您已经通过http://www.mongodb.org/display/DOCS/Schema+Design进行访问

模式设计在MongoDB中完全是一个相对的概念,它视情况而定。 您如何设计集合,链接与嵌入实际上取决于您的数据体系结构,数据大小以及您要查询的方式。

如果您的作者信息不会占用太多空间,那么我会说在文章的文档中嵌入作者信息是个好主意。 查找将非常快,因为您可以在Articles和Authors上都有索引(即使它们是嵌入式的)。

当作者更改其信息时,很容易在整个范围内更新其信息集合。 您只需要对在其作者列表中列出该作者的文章进行更新。 特别是通过使用$(位置运算符)。 http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

但是,如果您担心大小和限制,那就另当别论了。 正如@Derick提到的,16MB很大,我的意思是很多。 因此,如果您认为自己将达到极限,请去收集单独的收藏并进行链接。

据我所知,默认情况下,MongoDB不提供跨多个集合的MapReduce功能,您可能最终会分几个步骤进行操作,这将非常消耗资源。

对于生产使用,MapReduce并不是非常理想。 最好将其用于批处理过程,但对于实时聚合,最好提供不同的解决方案(适合您的需求)并对它们进行基准测试。 有时,在脚本端(Python,PHP等)查找文档并进行汇总甚至更快。

最后一点,我只想说,无论MongoDB和NoSQL一般多么漂亮,快速和流行,但是它们可能并不能解决所有问题。 传统的关系方法可以最好地解决一些问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM