0

我有企业收藏。

业务由用户审核。

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

这就是我们存储它的方式

 "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"}
    ]
  }

所以基本上我们希望可以将它存储为一个字典,其中键是用户 ID,或者我们可以将它存储为一个数组,其中用户 ID 是字段键。所以第二种方法的关键是静态的,即用户ID。

我们想要索引条目。例如,用户可能想知道他评论了哪些业务。

我应该使用哪种方法?

4

2 回答 2

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. 获取按日期排序的业务评论。

更新:

假设您改为选择执行以下操作:

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

我建议您不要将所有评论都放在一个文档中,例如在一个文档中说“B1”,如果您有一个“企业”集合,就会发生这种情况。

为什么不是“商业”系列:

  1. 它会使您的查询和索引变得复杂,并且
  2. 如果一个非常受欢迎的“BusinessX”的评论太多,它将达到16MB的限制。
于 2012-12-21T09:27:17.097 回答
1

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

在此处对字段进行索引的问题Reviews是您拥有的评论内容字段。

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

因此,考虑到这一点,我已经不建议在字段本身上形成索引。

但是,关于哪个索引是最好的,对于您的查询来说是非常主观的。

如果您只通过一个字段或另一个查询,即day或者userid然后我将创建两个单独的索引,但是如果您在查询中组合您的字段,我很可能会选择索引的复合版本。

于 2012-12-21T09:44:28.020 回答