如何正确存储我们想要在mongodb中索引的数据

时间:2012-12-21 08:30:04

标签: mongodb

我有商家收藏。

用户会审核该商家。

每位用户只能查看一次商家。未来的评论将简单地取代前者。

这是我们存储它的方式

 "Reviews" : {
    "gusyanto" : {
      "day" : "December 21, 2012, 8:08 am",
      "review" : "Tes review"
    },
    "sapi" : {
      "day" : "December 21, 2012, 8:18 am",
      "review" : "makanan ini sangat enak"
    }
  }

或者我们也可以使用这个

 "Reviews" : [{
      "userid" : "gusyanto",
      "day" : "December 21, 2012, 8:08 am",
      "review" : "Tes review"
    },
    {
      "userid" : "sapi",
      "day" : "December 21, 2012, 8:18 am",
      "review" : "makanan ini sangat enak"}
    ]
  }

所以基本上我们想要将它存储为字典,其中键是userid,或者我们可以将其存储为userID是字段键的数组。所以第二种方法的关键是静态即userID。

我们想要为条目编制索引。例如,用户可能想知道他已经审查了哪些商家。

我应该使用哪种方法?

2 个答案:

答案 0 :(得分:2)

好吧,我会这样做:

                          reviews (collection)
                                  |
                                  |
                    ______________|______________
                   |                             |
                 Doc 1                        Doc 2
  {"user_id": "USer1",                      {"user_id": "USer2",
   "review" : "Tes review",                  "review" : "makanan ini sangat enak",
   "date"   : "December 21, 2012, 8:08 am",  "date"   : "December 21, 2012, 8:08 am",
   "business": "Business1"                   "business": "Business2"
  }                                         }

然后你可以建立一个索引如下:

  db.reviews.ensure_index([("user_id", ASCENDING), ("date", ASCENDING)])
  db.reviews.ensure_index([("business", ASCENDING), ("date", ASCENDING)])

现在您可以执行查询(在 log(n)时间内),例如:

  1. 按日期排序 User1 的所有评论。
  2. 获取按日期排序的商家评论。
  3. 更新

    假设你选择做这样的事情:

                              Businesses (collection)
                                      |
                                      |
                        ______________|______________
                       |                             |
                 BusinessDoc 1                    BusinessDoc 2
      {"business": "business1",                      {"user_id": "business",
       "review" : {..business1 reviews here..},     "review" : {..business2 reviews here..},
      }                                         }
    

    我建议你不要将所有评论都放在一个商家中,在单个文档中说“B1”,如果你有一个“商家”系列会发生什么。

    为什么不是'商业'系列:

    1. 它会使您的查询和索引变得复杂,并且
    2. 如果对非常受欢迎的'BusinessX'有太多评论,它会达到 16MB 限制。

答案 1 :(得分:1)

我将以你的文件为例,一个例子;但是,我想提一下,以字符串格式存储日期可能会损害您的索引和查询能力。

在此Reviews字段上制作索引的问题在于您拥有的评论内容字段。

我可以轻松地想象对于单个索引字段来说太大了,在这种情况下会抛出异常并且不会将其编入索引(http://docs.mongodb.org/manual/reference/limits/#Index%20Sizehttp://docs.mongodb.org/manual/core/indexes/#indexes-on-sub-documents)。这可能是MongoDB中全文字段的最大问题之一。

因此,考虑到这一点,我已经不建议在场地上形成一个指数。

但是,关于哪个指数最好是对你的查询极其主观。

如果您只是通过一个字段或另一个字段查询,即dayuserid,那么我会创建两个单独的索引,但是如果您在查询中组合字段,我很可能会去索引的复合版本。