Mongodb设计活动日历

时间:2011-11-22 16:02:09

标签: mongodb

我们有一个事件日历,这就是我对基本mongo架构的想法:

用户

  • 用户名
  • 密码

事件

  • 名称
  • 描述
  • 标记[]
  • 类别
  • venue_id ...

场地

  • 姓名
  • 地址
  • LOC

将要完成的查询是:

  • 列出不同的标签(这可能很难给出当前设计)
  • 给定标记中的事件
  • 活动信息以及场地位置
  • 特定活动的所有活动和场地信息
  • 我附近的所有事件。需要在loc
  • 上使用地理索引

关于我们是否应该在事件中嵌套场地或使用mysql的任何反馈/想法?

1 个答案:

答案 0 :(得分:4)

好的,看起来很不错。让我们构建一些查询。

假设这些馆藏被命名为用户,活动,场地:

  • 插入一些虚拟事件

      

    db.events.insert({标签:[ “真棒”, “娱乐”, “酷”]})

         

    db.events.insert({标签:[ “甜”, “有趣”, “拉德”]})

  • 制作索引(就像老板一样)

      

    db.events.ensureIndex({tags:1})

  • 列出不同的标签(根据当前设计,这可能很难)

    不,不是很难。

      

    db.events.distinct( “标签”)

    [“awesome”,“cool”,“fun”,“rad”,“sweet”]

  • 给定标记中的事件(您的意思是“带有给定标记”对吗?)

      

    db.events.find({tags:“fun”})

    {“_ id”:ObjectId(“4ecc08c62477605df6522c97”),“tags”:[“awesome”,“fun”,“cool”]}

    {“_ id”:ObjectId(“4ecc08d92477605df6522c98”),“tags”:[“sweet”,“fun”,“rad”]}

  • 活动信息以及场地位置

    你可以通过几种不同的方式做到这一点。一种方法是查询事件并随后查询场地。使用这两个文档,手动连接(组合)您想要的数据。

    您可以对一些位进行非规范化并存储缓存的场地名称+位置(但不包括场地细节,如营业时间,最大占用率,网站,电话号码等)以提高速度(1次查询而不是2次)该方法附带标准的非规范化警告,无法在一个地方更新您的数据。

  • 特定活动的所有活动和地点信息

    见上文

  • 我附近的所有活动。需要在loc

    上使用地理索引

    再次进行两次查询,与上述相同的概念只是颠倒了顺序。

    获取场地:

      

    db.venues.find({loc:{$ near:[lat,lon]}})

    使用场地ID获取活动:

      

    db.events.find({场地:{$ in:[id1,id2,id3 ...]}})

如果您使用ODM,可以自动完成部分内容。

祝你好运!