Mongodb,问题很简单

Mongodb,问题很简单,mongodb,Mongodb,我是mongo的新手,这是我的db设计: 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, product

我是mongo的新手,这是我的db设计:

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}, ...],
}
因此,我的使用模式是: 给定一个产品,查找具有特定标签的注释并相应地对其进行排序

我目前的做法包括:

  • 查找具有 tag=myTag
  • 把所有的评论都整理出来
  • 在哪里寻找那个产品 product.name=myProduct
  • 把所有的评论都拉出来(它们是 (顺便提一下,参考数据库)
  • 循环2的结果,然后 检查它们是否在4(此I 可以做限制等

  • 效率很低。有更好的方法吗?

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

    comment := {
        product: product_id,
        tags: [tag1, tag2, ... ]
        ...
    }
    
    然后,给定一个产品,您可以执行以下操作:

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

    这种方法如此低效的原因是,您确实设计了数据库,使这个过程效率低下

    您将“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},... ] }, ... 
                  ]
    }
    
    如果您想更进一步,甚至可以完全删除“comments”集合。没有产品的评论,可能没有任何意义。因此,您可以在产品“对象”中创建整个注释“对象”

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

    现在您的查询更容易了。你可以直接抓取一个产品,然后在评论数组中循环寻找合适的标签。或者,您可以运行查询服务器端,让它按分数排序标记