我是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}, ...],
}
所以我的使用模式是: 提供产品,查找具有特定标记的评论并相应地对其进行排序。
我目前的做法涉及:
效率很低。有更好的方法吗?
答案 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})