Mongodb,简单IN问题

时间:2010-05-24 07:14:27

标签: mongodb

我是mongo的新手,这是我的数据库设计:

product := { 
    name: str
    group: ref,
    comments: [ ref, ref, ref, ref ] 
}

comments := { 
... a bunch of comments stuff

} 

tag := { 
    _id: int,               #Need this for online requests
    tag: str,
    products: [ {product: ref, score: float}, ... ],
    comments: [ {comment: ref, score: float}, ...],
}

所以我的使用模式是: 提供产品,查找具有特定标记的评论并相应地对其进行排序。

我目前的做法涉及:

  1. 查找具有的标记对象 标签= myTag
  2. 拉出所有评论,排序
  3. 寻找那个产品在哪里 product.name = myProduct的
  4. 取出所有评论(这是 顺便说一下dbrefs)
  5. 循环遍历2的结果,并且 检查他们是否在4,(这个我 可以限制10)等。
  6. 效率很低。有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

该方法效率低下的原因是您确实设计了数据库以使此过程效率低下。

您将“tags”集合构建为“comments”集合的父级。但是你说你想用“标签”加载“评论”。

通常在标记“评论”或“产品”时,“标记”属于“评论”或“产品”。但是你已经改变了这一点,你引用了来自标签的评论,而不是通过标签查找评论

我认为你正在寻找的是更像这样的东西。

  • 产品包含评论
  • 产品可以标记
  • 评论可以标记
  • 所有标签都有分数

这是数据结构的样子:

product := { 
    name: str,
    group: ref,
    tags: [ {ref, score}, {ref, score},... ]
    comments: [ { ref, tags: [ {ref, score}, {ref, score},... ] },
                { ref, tags: [ {ref, score}, {ref, score},... ] }, ... 
              ]
}

如果您想更进一步,甚至可以完全删除“评论”集合。没有产品的评论,可能没有任何意义。因此,您可以在Product“object”中创建整个Comment“对象”。

从“索引”角度来看,您可以在数组中进行索引。因此,您可以在product.tags和product.comments.tags上设置索引。

现在您的查询更容易了。您可以直接获取Product,然后遍历Comments数组以查找相应的Tag。或者您可以运行查询服务器端并让它按分数对标签进行排序。

答案 1 :(得分:0)

我不确定我是否理解您正在尝试正确执行的操作,但如果每个评论都有多个标记并且是对单个产品的评论,那么您可以使每个评论都有标记和产品字段。然后您的评论文件将如下所示:

comment := {
    product: product_id,
    tags: [tag1, tag2, ... ]
    ...
}

然后,给定产品,你可以这样做:

db.comments.find({product : productId, tags : myTag})