Mongo如何在博客文章示例中存储无限长的评论

时间:2015-03-06 16:17:31

标签: mongodb

我希望建立一个博客系统,并发现了以下博客。 http://blog.mongolab.com/2012/08/why-is-mongodb-wildly-popular/

虽然很高兴看到我们如何将一切Mongo文档中的所有内容存储为json类型对象(来自下面粘贴的博客的json示例),而不是在多个表格中分发数据,但我遇到了麻烦理解这是如何容纳一个假想的超长评论主题。

{
    _id: 1234,
    author: { name: "Bob Davis", email : "bob@bob.com" },
    post: "In these troubled times I like to …",
    date: { $date: "2010-07-12 13:23UTC" },
    location: [ -121.2322, 42.1223222 ],
    rating: 2.2,
    comments: [
       { user: "jgs32@hotmail.com",
         upVotes: 22,
         downVotes: 14,
         text: "Great point! I agree" },
       { user: "holly.davidson@gmail.com",
         upVotes: 421,
         downVotes: 22,
         text: "You are a moron" }
    ],
    tags: [ "Politics", "Virginia" ]
 }

除了表示为注释对象数组的注释键之外,允许我们在此文档中存储无数个注释,而不是在单独的注释表中,如果我们要执行此操作,则需要联接操作来关联关系数据库,其余字段(即作者,帖子,日期,位置,评级,标签)也可以作为关系数据库表上的列完成。

由于每个文档的限制为16MB,当此博客吸引大量评论时会发生什么?

另外,为什么我不能在关系数据库列上存储json对象?毕竟它的文字不是吗?

2 个答案:

答案 0 :(得分:1)

首先,澄清一下:MongoDB实际上存储了BSON,它实际上是支持更多数据类型的JSON的超集。

  

由于每个文档的限制为16MB,当此博客吸引大量评论时会发生什么?

您无法将大小增加到16MB以上,因此您将无法添加更多评论。但是,您不需要将所有评论存储在博客文章中。您可以存储第一个N,然后在添加新注释时将旧注释退回到注释集合。您可以使用父引用将注释存储在另一个集合中。存储注释的方式应该与您期望它们的使用方式相吻合。 16MB的评论确实很多 - 你甚至可能有一个特殊的解决方案来处理偶尔发布这种活动的帖子,这种方法与处理评论的正常方式完全不同。

  

我们可以将json存储在关系数据库中。那么Mongo的价值是什么?

这里有两种存储JSON的方式(在MongoDB中)。

> db.test.drop()
> db.test.insert({ "name" : { "first" : "Yogi", "last" : "Bear" }, "location" : "Yellowstone", "likes" : ["picnic baskets", "PBJ", "the great outdoors"] })
> db.test.findOne()
{
    "_id" : ObjectId("54f9f41f245e945635f2137b"),
    "name" : {
        "first" : "Yogi",
        "last" : "Bear"
    },
    "location" : "Yellowstone",
    "likes" : [
        "picnic baskets",
        "PBJ",
        "the great outdoors"
    ]
}

var jsonstring = '{ "name" : { "first" : "Yogi", "last" : "Bear" }, "location" : "Yellowstone", "likes" : ["picnic baskets", "PBJ", "the great outdoors"] }'
> db.test.drop
> db.test2.insert({ "myjson" : jsonstring })
> db.test2.findOne()
{
    "_id" : ObjectId("54f9f535245e945635f2137d"),
    "myjson" : "{ \"name\" : { \"first\" : \"Yogi\", \"last\" : \"Bear\" }, \"location\" : \"Yellowstone\", \"likes\" : [\"picnic baskets\", \"PBJ\", \"the great outdoors\"] }"
}

您可以使用关系数据库以第一种方式存储和使用JSON吗?与第一种方式相比,JSON以第二种方式存储有多大用处?

MongoDB和关系数据库之间存在许多其他差异,这些差异使得各种用例比另一个更好 - 但是进一步说到这一点对于SO答案来说太宽泛了。

答案 1 :(得分:0)

  

您可以使用关系数据库以第一种方式存储和使用JSON吗?   与第一种方式相比,JSON以第二种方式存储有多大用处?

对不起,您是否建议使用Mongo json文件可以不使用转义字符进行存储,而使用RDBMS我必须使用转义字符来转义双引号?我不知道是这样的。